我有一个名为 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/