【发布时间】:2020-04-22 00:44:45
【问题描述】:
我有一个类“SecretMessages”,它利用复制和分配的运算符重载。它有 3 个数据成员,最重要的是一个向量消息和一个向量 message_views,它对应于每条消息的剩余视图数。我遇到的问题是,当调用赋值运算符时,向量没有正确重新初始化。因此,即使我能够在函数内部正常读取所有被复制的数据,但当在 L 值上调用它时,这些值不会更新向量。
我的类定义如下所示:
class SelfDestructingMessage {
public:
vector<string> messages;
long number_of_allowed_views;
vector<long> message_views; // keeps track of each message view
...
SelfDestructingMessage(SelfDestructingMessage &sdm); // copy
SelfDestructingMessage operator = (SelfDestructingMessage &sdm); // assign };
这是我一直在运行的测试文件的输出,它创建了一个新的 SecretMessage 对象并将其分配给之前定义的对象。
sdm4: //message_views print is empty before assignment
ASSIGNMENT OP
printing out message_views after assign:
0
2
1
END ASSIGNMENT
sdm4 after message views after assignment:
0
0
0
我不确定为什么 sdm4 的 message_views 向量在 *this 返回后没有更新,即使值 0、1 和 2 都在分配函数的消息向量中。有什么想法吗?
【问题讨论】:
-
您还没有向我们展示复制构造函数。返回 *this 会创建一个副本,因为您没有使用 SelfDestructingMessage& 作为分配的返回顶部。此外,您对 operator= 的参数实际上应该是 const 并且您不应该修改它。这对于 RHS 值来说确实是出乎意料的。