我为特定的类重载了赋值运算符,此后我很快发现了一个问题。
在声明类对象期间,如果我使用已经存在的另一个对象对其进行初始化,
objectType object1;
objectType object2 = object1;
程序将终止,并显示一条消息。program.exe在运行期间已停止工作。
但是,如果我将声明和初始化步骤分开,
objectType object1, object2;
object2 = object1;
它将运行正常。
如果我们可以使用简单的数据类型做到这一点,
int x = 6;
int y = x;
为什么我们不能对类对象执行此操作?我希望我的问题很清楚,并且已经在具有相同.exe的其他计算机上测试了此结果,从而停止了工作。
编辑: 这是我的代码。该类本身是一个堆栈。
#include <iostream>
using namespace std;
struct nodeType
{
int info;
nodeType *link;
};
class objectType
{
public:
const objectType& operator=(const objectType& otherObject)
{
if(this != &otherObject)
{
copyObject(otherObject);
}
return *this;
}
void initialize() //Initialize the stack
{
nodeType *temp;
while(stackTop != nullptr)
{
temp = stackTop;
stackTop = stackTop->link;
delete temp;
}
}
objectType(const objectType& otherObject) //Copy constructor
{
copyObject(otherObject);
}
objectType() //Constructor
{
stackTop = nullptr;
}
~objectType() //Destructor
{
initialize();
}
private:
nodeType* stackTop;
//Copy function to implement copy constructor and overload assignment operator
void copyObject(const objectType& otherObject)
{
initialize();
if(otherObject.stackTop != nullptr)
{
nodeType *current, *last, *newNode;
current = otherObject.stackTop;
stackTop = new nodeType;
stackTop->info = current->info;
stackTop->link = nullptr;
last = stackTop;
current = current->link;
while(current != nullptr)
{
newNode = new nodeType;
newNode->info = current->info;
newNode->link = nullptr;
last->link = newNode;
last = newNode;
current = current->link;
}
}
}
};
int main()
{
objectType object1;
objectType object2 = object1;
return 0;
}
用调试器测试它之后,我发现问题是析构函数。据我所知,当对象超出范围时将调用析构函数。在这种情况下,对象是否超出范围?
P.S。现在可以将此代码视为MCVE吗?是的,重现代码确实可以帮助我找出问题的真正根源。
答案 0 :(得分:1)
这意味着您的select distinct w.word, C.SumOfPoints as sumofpoints
from words w
CROSS APPLY (SELECT SUM(points) AS SumOfPoints from words w2 WHERE w2.word like '%' +
w.word + '%') C
的副本构造函数实现已损坏,但是有一个有效的副本分配运算符。
通过使用任何其他类型(例如objectType
)来证明自己不是类的功能。
很遗憾,我们无法告诉您如何损坏,因为我们看不到它;启动调试器并破解!