Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.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++_Operator Overloading - Fatal编程技术网

C++ 运算符重载问题

C++ 运算符重载问题,c++,operator-overloading,C++,Operator Overloading,我有一个场景类,其成员变量为Image**images,int*xcoords,int*ycoords。现在,我正在尝试重载我的=运算符 我得到以下内存错误(使用valgrind) 从上面(scene.cpp:160)看到的这条线是 所以他们说图像没有初始化 因此,调用drawscene()的任何其他地方都不会导致任何问题,但我认为,因为使用了=运算符,所以导致了问题 有人能看到我的代码中可能导致此错误的任何问题吗?您需要: if(source.images[i]!=NULL)

我有一个场景类,其成员变量为Image**images,int*xcoords,int*ycoords。现在,我正在尝试重载我的=运算符

我得到以下内存错误(使用valgrind)

从上面(scene.cpp:160)看到的这条线是

所以他们说图像没有初始化

因此,调用drawscene()的任何其他地方都不会导致任何问题,但我认为,因为使用了=运算符,所以导致了问题

有人能看到我的代码中可能导致此错误的任何问题吗?

您需要:

        if(source.images[i]!=NULL) {
            images[i]=new Image;
            *images[i]=*source.images[i];
            xcoords[i]=source.xcoords[i];
            ycoords[i]=source.ycoords[i];
        } else {
            images[i] = NULL;
        }
这将解决你眼前的问题。但真的,你走错了路。如前所述,您应该使用

使用该习惯用法的原因是异常安全。如果某物在该代码的中间抛出异常,则操作符=(还有很多可以做的,因为它做了这么多),你将在一个未定义的状态下离开这个对象,这是非常糟糕的。复制和交换习惯用法允许您编写一个异常安全的复制构造函数(这仍然有点棘手),然后利用它来构建赋值运算符


作为额外的奖励,您可以获得一个工作副本构造函数和一个
swap
函数。复制构造函数非常方便地将内容填充到STL容器中,并按值传递或返回内容。而且
swap
函数对于类的用户非常有用,特别是那些想要实现自己的异常安全复制构造函数和赋值运算符的用户。

如果
源代码,您只需初始化
图像[i]
。图像[i]
为非空。如果
source.images[i]
为空,则在
images[i]

中留下随机垃圾,还记得我说过的吗?也就是说,使用它?是的,但这是我们应该为这个类实现它的方式。我认为我的回答几乎正确,但我看不出错误在哪里。我否决了你的问题,主要是因为虽然这不是一个坏问题,但它非常具体,最多应该是3分,可能是2分,甚至1分。
if (images[i]!=NULL) 
        if(source.images[i]!=NULL) {
            images[i]=new Image;
            *images[i]=*source.images[i];
            xcoords[i]=source.xcoords[i];
            ycoords[i]=source.ycoords[i];
        } else {
            images[i] = NULL;
        }