C++ 在C+中,运算符重载工作但导致堆栈溢出和崩溃+;
我编写了这个节点类和=操作符重载函数,这是唯一可以让它编译和运行的方法,但它只是溢出并轰炸我的程序。有人能帮我修一下吗。对于C++中的重载操作符,我没有很多经验。我只想将一个节点对象设置为另一个节点对象。提前谢谢C++ 在C+中,运算符重载工作但导致堆栈溢出和崩溃+;,c++,operator-overloading,stack-overflow,C++,Operator Overloading,Stack Overflow,我编写了这个节点类和=操作符重载函数,这是唯一可以让它编译和运行的方法,但它只是溢出并轰炸我的程序。有人能帮我修一下吗。对于C++中的重载操作符,我没有很多经验。我只想将一个节点对象设置为另一个节点对象。提前谢谢 class Node { public: Node(); int y; Node& operator=(const Node& n); }; Node::Node(){ y = -1; } Node& Node::o
class Node
{
public:
Node();
int y;
Node& operator=(const Node& n);
};
Node::Node(){ y = -1; }
Node& Node::operator=(const Node& n) { return *this = n; }
在
操作符=
中,需要将成员变量设置为传入节点的值
Node& Node::operator=(const Node& n)
{
y = n.y;
return *this;
}
你在英语中所做的一个相应的例子:狗的定义是狗。与其说狗的定义是狼的驯养形式,不如说它是食肉目犬科的一员 您的问题是
Node::operator=(const Node&n)
包含return*this=n代码><代码>返回*this=n
调用operator=
,因为您正在类的一个实例和另一个实例上使用=。您有一个无限递归,因为*this=n正在调用Node::operator=()(因为这是一个节点)。赋值运算符的通常行为类似于复制构造函数,但必须检查自赋值。请参阅:只需删除有问题的函数即可。C++为您定义了默认的<代码>运算符=< /代码>。函数在任何意义上都是“存在”的:您可以获得指向它的指针,等等。但是,如果添加重载,默认值将完全消失,并且在其中使用=
会导致递归
如果您实际上有额外的功能添加到operator=
,您也必须自己实现默认功能,即y=n.y代码>。您的重载将终止默认的=
,因此*this=n
除了调用本身之外,没有其他事情可做
如果您有很多数据成员,一种替代方法是声明一个类,只使用其默认的操作符=
:
struct Node_data { // "POD" struct for just data, no methods
int q,r,s,t,u,v,w,x,y,z; // rough example ;v)
};
class Node : public Node_data {
…
Node & Node::operator=( const Node &n ) {
Node_data::operator=( n ); // compiler-generated func
cout << "operator= called" << endl;
}
};
struct Node_data{//“POD”结构只用于数据,不用于方法
int q,r,s,t,u,v,w,x,y,z;//粗略示例;v)
};
类节点:公共节点\u数据{
…
节点和节点::运算符=(常量节点和n){
Node_data::operator=(n);//编译器生成的func
cout您的重载运算符是如下代码的调用对象:
node = someothernode;
由于“*nodeptr”相当于“node”,您已经创建了一个调用自身的运算符。您知道赋值运算符的用途吗?感谢大家的帮助,我现在就得到了它。我知道这很简单,只是我很少有重载的经验。谢谢!!!他根本不需要定义运算符=。您的定义与def相同奥尔特的定义。我想他发布了一个他想做的简单例子。你忘了检查自我分配。
node = someothernode;