运算符重载工作但在C ++中给堆栈溢出和崩溃

时间:2010-02-22 02:00:18

标签: c++ operator-overloading stack-overflow

我编写了这个Node类和=运算符重载函数,这是我能够编译和运行它的唯一方法,但它只是溢出并炸弹我的程序。有人可以解决它,以便它的工作原理。我没有很多在C ++中重载运算符的经验。我只想将Node对象设置为等于另一个Node对象。提前谢谢!

class Node
{ 
   public:
      Node();
      int y;
      Node& operator=(const Node& n);
};

Node::Node(){ y = -1; }
Node& Node::operator=(const Node& n) { return *this = n; }

Build issues:
1>c:\users\aaron mckellar\documents\school stuff\cs445\test\test\main.cpp(57) : warning C4717: 'Node::operator=' : recursive on all control paths, function will cause runtime stack overflow
1>Linking...
1>LINK : C:\Users\Aaron McKellar\Documents\School Stuff\CS445\Test\Debug\Test.exe not found or not built by the last incremental link; performing full link

5 个答案:

答案 0 :(得分:5)

operator=中,您需要将成员变量设置为等于传入的Node值。

Node& Node::operator=(const Node& n) 
{ 
    y = n.y;
    return *this; 
}

你用英语做的相应例子:狗的定义是狗。而不是说狗的定义是狼的驯化形式,是食肉目的Canidae家族的成员。

答案 1 :(得分:1)

你有一个无限递归,因为* this = n正在调用Node :: operator =()(因为这是一个Node)。赋值运算符的通常行为类似于复制构造函数,但您必须检查自我赋值。请参阅:http://www.parashift.com/c++-faq-lite/assignment-operators.html

答案 2 :(得分:1)

只需删除有问题的功能即可。 C ++为您定义了默认的operator=。在任何意义上,函数都是“存在”:你可以获得指向它的指针等等。但是,如果你添加一个重载,默认就会完全消失,并且在其中使用=会导致递归。

如果你真的有其他功能可以添加到operator=,你必须自己实现默认功能,即y = n.y;。您的重载会终止默认=,因此*this=n除了调用自身之外无需执行任何操作。

如果你有很多数据成员,一种方法是声明一个类只是为了使用它的默认operator=

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;
    }
};

答案 3 :(得分:0)

您的问题是Node::operator=(const Node& n)包含return *this = n;return *this = n;调用operator=,因为您在类的实例和类的另一个实例上使用=。

答案 4 :(得分:0)

您的重载运算符是代码的调用,如下所示:

node = someothernode;

由于'* nodeptr'等同于'node',因此您创建了一个调用自身的运算符。