Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 力C++;类实例以在复制或指定时更改成员值_C++_Vector_Copy Constructor_Assignment Operator - Fatal编程技术网

C++ 力C++;类实例以在复制或指定时更改成员值

C++ 力C++;类实例以在复制或指定时更改成员值,c++,vector,copy-constructor,assignment-operator,C++,Vector,Copy Constructor,Assignment Operator,我有一个名为Solution的类,定义如下。我只包含了相关代码,我没有编写自定义副本或赋值运算符 class Solution { public: Solution() { stream.setNewSeed(seedShift+static_cast<long>(12345)); ++seedShift; } RandomNumberStream stream; private: static long se

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

class Solution {

public:

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

    RandomNumberStream stream;

private:

    static long seedShift = 0;
};
类解决方案{
公众:
解决方案(){
stream.setNewSeed(seedShift+static_cast(12345));
++移种;
}
随机数字流;
私人:
静态长位移=0;
};
这里的要点是,我希望
Solution
的每个新实例都有一个不同的随机数流。这很有效

然而,问题是,在某些地方,我从
std::vector
复制
Solution
的实例,稍微修改它,然后将副本推到相同的
std::vector
。当这种情况发生时,我有两个具有相同随机数种子的
Solution
实例,灾难接踵而至


我如何导致流.setNewSeed(seedShift+static_cast(12345))和
++seedShift解决方案
实例中运行的code>语句?

使赋值运算符过载。注意-这也意味着当您从向量中读取值和/或复制向量本身时,随机数种子也将再次改变

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;
};
类解决方案{
公众:
解决方案(){
stream.setNewSeed(seedShift+static_cast(12345));
++移种;
}
解决方案和运算符=(解决方案和其他)
{
stream.setNewSeed(seedShift+static_cast(12345));
++移种;
x=其他。x;
y=其他。y;
z=其他。z;
归还*这个;
}
随机数字流;
私人:
静态长位移=0;
};

推入
向量
将使用复制构造函数(或移动构造函数,但我们将简化它,并假设它现在使用复制构造函数)。签名如下:

Solution(const Solution& rhs);
然后,您可以非常简单地实现此逻辑:

Solution(const Solution& rhs)
{ 
     stream.setNewSeed(seedShift + 12345L);
     ++seedShift;
}
注意:如果实现此操作,可能还应该实现复制分配操作符:

Solution& operator=(const Solution& rhs)
{
    if(this != &rhs) {
        stream.setNewSeed(seedShift+static_cast<long>(12345));
        ++seedShift;
    }
    return *this;
}
解决方案和运算符=(常量解决方案和rhs)
{
如果(此!=&rhs){
stream.setNewSeed(seedShift+static_cast(12345));
++移种;
}
归还*这个;
}

你说你没有写这两本书。为什么不呢?因为我是新手,不确定这些是否是需要的。。。虽然我怀疑他们可能是。如果需要,我不知道如何编写它们。您需要使用与默认构造函数相同的操作来实现复制构造函数。但是,当我实现复制构造函数时,是否需要编写代码来复制所有其他类成员(上面未显示)?仅供参考:我没有任何指针作为成员,因此这里不需要深度复制(或任何调用)。这取决于您拥有的成员类型,但您可以编写一个执行公共操作的公共函数,并从这两个函数调用它。假设还有其他成员变量,如
int Solution::x
。那么,当我复制
解决方案
实例时,我是否需要在自定义复制构造函数中编写代码,以便复制
解决方案::x
的值?@synaptik-绝对是。好的,因此没有简单的方法向默认复制构造函数添加代码。如果希望以任何方式实现非默认行为,则必须完全定义复制时发生的一切。正确吗?使用
向量
通常需要
可移动
可复制
。您想在这里实现复制构造函数;赋值运算符可以说不那么重要,尽管它的实现应该保持最小意外的原则。