gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:38:00 25 4
gpt4 key购买 nike

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

我对运算符重载概念的理解是,您在类中声明一个函数,使用关键字 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(&str){}

是错误的,因为你保存了参数的地址,你需要把它改成例如:

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

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

关于c++ - 如何修复 C++ 中重载加法运算符的堆栈溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56401581/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com