如何修复 c++ 中重载加法运算符上的堆栈溢出
How to fix stack overflow on overloaded addition operator in c++
我正在尝试学习 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
在返回对象中。
如何解决此问题,以便在代码运行时不会出现堆栈溢出,以及如何获得正确的返回值?
in
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;
}
运算符+递归调用自己,你必须真正实现加法
可能你想要:
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)) {}
并且有一个指针,您需要添加析构函数以删除字符串,复制构造函数,运算符=等查看rule_of_three
在运算符重载中,要考虑的关键概念是,如果要定义的类型是基元类型,则行为会如何。例如,将指向字符串的指针与另一个指向字符串的指针添加是什么样子的。
如上所述,您的定义是递归调用运算符+。
下面是一个可能有用的示例:https://www.geeksforgeeks.org/operator-overloading-c/
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 在功能块中使用新运算符时存在于堆或堆栈上?
- 使用堆栈编译错误的 C++ 反向行没有运算符匹配操作数
- C++对自动(堆栈)指针使用运算符删除
- 如何修复 c++ 中重载加法运算符上的堆栈溢出
- 重载时获取堆栈溢出 >> 运算符函数是为类调用的。我需要进行哪些更改?
- 对运算符重载和堆与堆栈的混淆
- 使用条件运算符递归计算模板化值或函数时出现错误 C1202(堆栈溢出)
- C++ STL 关系运算符如何比较堆栈
- 堆栈类中的赋值运算符故障
- 分段错误(核心转储) 覆盖运算符时<<堆栈
- 堆栈的重载比较运算符
- 堆栈列表类的重载>>运算符
- 错误 C2244:"堆栈:<T>:运算符=":无法将函数定义与现有声明匹配
- Visual Studio 2008 运行时堆栈溢出警告,当运算符在所有路径上<递归时警告
- 检测对堆栈变量的调用delete(使用强制转换到指针运算符)