【问题标题】:Vectors not reinitialized properly when calling overloaded assignment function调用重载赋值函数时向量未正确重新初始化
【发布时间】: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 值来说确实是出乎意料的。

标签: c++ assignment-operator


【解决方案1】:

看起来你的赋值返回是复制对象,所以你的 return 语句调用你的复制构造函数。你没有把那个发给我们,但如果它清除了它的论点,它就会清除 *this。

尝试将赋值运算符的返回类型更改为 SelfDestructingMessage &,以便不调用副本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多