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

我编写了这个节点类和=操作符重载函数,这是唯一可以让它编译和运行的方法,但它只是溢出并轰炸我的程序。有人能帮我修一下吗。对于C++中的重载操作符,我没有很多经验。我只想将一个节点对象设置为另一个节点对象。提前谢谢

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;