【发布时间】:2011-05-16 08:22:57
【问题描述】:
如果我是正确的,请确认并告诉我是否有更好的解决方案:
我了解具有int const width; 等常量成员的对象无法由编译器隐式创建的合成赋值运算符处理。但是 QList (我想也是 std::list )需要一个有效的赋值运算符。因此,当我想使用具有常量成员和 QList 的对象时,我有三种可能性:
- 不要使用常量成员。 (不是解决方案)
- 实现我自己的赋值运算符。
- 使用其他不需要分配的容器 运营商
正确吗?还有其他优雅的解决方案吗?
我也想知道我是否可以:
- (4) 强制编译器创建处理常量成员的赋值运算符! (我不明白为什么这是一个这么大的问题。为什么操作员不够聪明,无法在内部使用初始化列表?还是我遗漏了什么?)
- (5) 告诉 QList 我永远不会在列表中使用赋值操作。
编辑:我自己从不分配此类的对象。它们仅由复制构造函数或重载构造函数创建。所以赋值运算符只有容器需要,我自己不需要。
EDIT2:这是我创建的赋值运算符。我不确定它是否正确。 Cell 有一个两个参数的构造函数。这些参数使用初始化列表设置两个常量成员。但该对象还包含其他变量(非 const)成员。
Cell& Cell::operator=(Cell const& other)
{
if (this != &other) {
Cell* newCell = new Cell(other.column(), other.row());
return *newCell;
}
return *this;
}
EDIT3:我发现这个帖子几乎有相同的问题:C++: STL troubles with const class members 所有答案结合在一起回答了我的问题。
【问题讨论】:
-
为什么 (1) 不是解决方案?这是显而易见的解决方案。
-
如果类通常是可赋值的,那么成员就不会是常量?!
-
@James McNellis:因为当这个属性应该保持不变时,就完成了成员常量。我不想仅仅因为赋值运算符无法处理它而忽略这个设计决策。
-
@UncleBens:对不起,我不明白。
-
编辑后的版本不进行赋值。它只会让你泄漏一些内存。
标签: c++ qt assignment-operator qlist class-constants