常量类成员、赋值运算符和 QList

2024-05-24

请确认我是否正确并告诉我是否有更好的解决方案:

我了解具有常量成员的对象,例如int const width;无法由编译器隐式创建的合成赋值运算符处理。但是 QList (我想 std::list 也是如此)需要一个有效的赋值运算符。因此,当我想使用具有常量成员和 QList 的对象时,我有三种可能性:

  1. 不要使用常量成员。 (不是解决方案)
  2. 实现我自己的赋值运算符。
  3. 使用一些其他不需要分配的容器 运营商

那是对的吗?还有其他优雅的解决方案吗?

我也想知道我是否可以:

  • (4) 强制编译器创建一个处理常量成员的赋值运算符! (我不明白为什么这是一个大问题。为什么操作员不够聪明,无法在内部使用初始化列表?或者我错过了什么?)
  • (5) 告诉QList我永远不会在列表中使用赋值操作。

编辑:我自己从不分配此类的对象。它们仅由复制构造函数或重载构造函数创建。所以赋值运算符只是容器需要的,而不是我自己需要的。

EDIT2:这是我创建的赋值运算符。我不确定它是否正确。 Cell 有一个两个参数的构造函数。这些参数使用初始化列表设置两个常量成员。但该对象还包含其他变量(非常量)成员。

Cell& Cell::operator=(Cell const& other)
{
 if (this != &other) {
  Cell* newCell = new Cell(other.column(), other.row());
  return *newCell;
 }
 return *this;
}

EDIT3:我发现这个线程有几乎相同的问题:C++:const 类成员的 STL 问题 https://stackoverflow.com/q/3372487/502721所有答案结合在一起回答了我的问题。


您可能是 C++ 的新手,希望它的行为像 Python、Java 或 C#。

将不可变的 Java 对象放入集合中是很常见的。这是可行的,因为在 Java 中,你并没有真正把 Javaobjects进入集合,但仅限于 Java参考指的是 Java 对象。更准确地说,集合内部由 Java 引用变量组成,对这些 Java 引用变量进行赋值根本​​不会影响所引用的 Java 对象。他们甚至没有注意到。

我故意说“Java对象”、“Java引用”和“Java变量”,因为术语“对象”、“引用”和“变量”在C++中具有完全不同的含义。如果你想要可变的T变量,你想要可变的T对象,因为变量和对象在 C++ 中基本上是相同的:

变量是通过对象的声明引入的。变量的名称表示对象。

在 C++ 中,变量不包含对象——它们are objects。分配给变量意味着更改对象(通过调用成员函数operator=)。没有其他办法了。如果你有一个不可变的对象,那么赋值a = b cannot可能在不显式破坏类型系统的情况下工作,如果你这样做,那么你实际上就向客户谎称对象是不可变的。做出承诺然后故意违背它是毫无意义的,不是吗?

当然你可以简单地模拟Java方式:使用集合pointers到不可变的对象。这是否是一个有效的解决方案取决于您的对象真正代表什么。但仅仅因为这在 Java 中运行良好并不意味着它在 C++ 中运行良好。C++ 中不存在不可变值对象模式这样的东西。这在 Java 中是一个好主意,但在 C++ 中是一个糟糕的主意。

顺便说一句,您的赋值运算符完全不惯用并且会泄漏内存。如果你认真学习 C++,你应该阅读其中一本 https://stackoverflow.com/questions/388242/.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

常量类成员、赋值运算符和 QList 的相关文章

随机推荐