c++ - 强制 C++ 类实例在复制或分配时更改成员值

标签 c++ vector copy-constructor assignment-operator

我有一个名为 Solution 的类定义如下。我只包含了相关代码,并且我没有编写自定义复制或赋值运算符。

class Solution {

public:

    Solution() {
        stream.setNewSeed(seedShift+static_cast<long>(12345));
        ++seedShift;
    }

    RandomNumberStream stream;

private:

    static long seedShift = 0;
};

这里的重点是我想要 Solution 的每个新实例有一个不同的随机数流。这行得通。

但是,问题是我在某些地方复制了 Solution 的实例。来自std::vector<Solution> ,稍微修改一下,然后将拷贝推送到相同的 std::vector<Solution> .发生这种情况时,我有两个 Solution 实例使用相同的随机数种子,灾难随之而来。

我怎样才能导致 stream.setNewSeed(seedShift+static_cast<long>(12345));++seedShift;要在复制的 Solution 中运行的语句被推到 vector 上的实例?

最佳答案

重载赋值运算符。注意 - 这也意味着当您从 vector 中读取值和/或复制 vector 本身时,随机数种子也会再次更改。

class Solution {

public:

    Solution() {
        stream.setNewSeed(seedShift+static_cast<long>(12345));
        ++seedShift;
    }

    Solution& operator=(Solution& other)
    {
        stream.setNewSeed(seedShift+static_cast<long>(12345));
        ++seedShift;


        x = other.x;
        y = other.y;
        z = other.z;


        return *this;
    }

    RandomNumberStream stream;

private:

    static long seedShift = 0;
};

关于c++ - 强制 C++ 类实例在复制或分配时更改成员值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16007601/

相关文章:

C++/Node.js :binding. gyp 库失败

c++ - 如何删除 C++ 映射中的键值对?

c++ - 简单参数转发(我的签名应该是什么?)

C++按值从 vector 中删除元素

c++ - 强制编译器选择以 const T& 作为参数的复制构造函数

c++ - 可以将 std::condition_variable 与 std::lock_guard 一起使用吗?

c++ - std::vector 的自包含、STL 兼容实现

c++ - 这里有循环依赖吗?

c++ - 重置对象 object = Object(new, parameters);

c++ - 多重继承类的复制构造函数