我正在尝试学习c++中的运算符重载的概念,但是我遇到了一个问题,我试图使用operator+
解决,在我的主函数中我一起添加了userdefiend类。
类构造函数将字符串指针作为参数。
我对operatoroverloading概念的理解是,您使用关键字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
}
我知道我在重载函数中出现堆栈溢出。
在主要方法中,我有以下代码:
void main(){
Hello h1("Hello ");
h1 + Hello("World");
}
我不支持以正确的方式对此进行编码,但是如果我没有记错的话,结果应该是返回对象中的
Hello World
。我该如何解决这个问题,以便在代码运行时不会出现堆栈溢出,以及如何获得正确的返回值?
最佳答案
在
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(new string(str)) {}
并有一个指针,您需要添加析构函数以删除字符串,然后使用复制构造函数,operator =等查看rule_of_three
关于c++ - 如何在C++中解决重载加法运算符上的堆栈溢出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56401581/