如何在C ++中修复重载加法运算符上的堆栈溢出

时间:2019-05-31 20:49:00

标签: c++ oop operator-overloading

我正在尝试学习c ++中的运算符重载的概念,但是我遇到了一个问题,我试图使用operator+解决,在我的主函数中添加了userdefiend类一起。 类构造函数将字符串指针作为参数。

我对运算符重载概念的理解是,您使用关键字operatorX在类中声明一个函数,然后将X替换为要重载的运算符。就像我想重载'-'运算符一样,我应该这样写operator-。但是,当我调试代码时,它会导致堆栈溢出,并且程序会停止。

该类如下:

class Hello{
public:
    Hello(string str):pstr(&str){

    }
    //The overloaded function below
    Hello operator+(Hello& h1){
        Hello temp(*this);//creates a copy of the current Hello-object
        temp = temp + h1;//adds the new value to the temporary object
        return temp; 
    }
private:
    string* pstr;//pointer to string-object
}

我知道我在重载函数中出现了堆栈溢出。

在main方法中,我有以下代码:

void main(){
    Hello h1("Hello ");
    h1 + Hello("World");
}

我不支持以正确的方式对此进行编码,但是如果我没记错的话,结果应该是Hello World在返回对象中。

如何解决此问题,以便在代码运行时不会出现堆栈溢出,还如何获得正确的返回值?

2 个答案:

答案 0 :(得分:7)

Hello operator+(Hello& h1){
    Hello temp(*this);//creates a copy of the current Hello-object
    temp = temp + h1;//adds the new value to the temporary object
    return temp; 
}

operator +递归调用自己,您必须真的实施加法

可能是您想要的:

Hello operator+(const Hello& h1) {
    Hello temp(*pstr + *(h1.pstr))
    return temp;
}

除此之外,为什么要用 pstr 作为指向std::string的指针,而不是仅仅包含std::string str;

例如,拥有一个实用得多的

class Hello{
  public:
    Hello(string s) : str(s) {  }

    Hello operator+(const Hello& h1){
       Hello temp(str + h1.str);

       return temp;
    }
  private:
    string str;
};

请注意,如果您真的想拥有string* pstr;您的构造函数

Hello(string str):pstr(&str){}

是错误的,因为保存了参数的地址,您需要将其更改为例如:

Hello(string str) : pstr(new string(str)) {}

,并且有一个指针,您需要添加析构函数以删除字符串,而复制构造函数,operator =等要看rule_of_three

答案 1 :(得分:0)

在运算符重载中,要考虑的关键概念是,如果您定义的类型是原始类型,行为将如何。例如,添加一个指向字符串的指针和另一个指向字符串的指针的样子。

如上所述,您的定义是递归调用operator +。

以下是一个可能有用的示例:https://www.geeksforgeeks.org/operator-overloading-c/