我正在尝试重载<<此类中的运算符,但这是输出:
Hello,
Segmentation fault: 11
这是我的代码:
test.cc:
#include <iostream>
#include "class.h"
#include <string>
using namespace std;
int main() {
MYString s("Hello");
MYString s2;
string hello = "Hello";
cout << s.text << ", " << s2.text << endl;
cout << "S: " << s << endl;
hello[0] = 'M';
cout << hello << endl;
return 0;
}
这是class.h:
#ifndef CLASS_H
#define CLASS_H
#include <string>
using namespace std;
class MYString {
public:
string text;
MYString(string data="") {
text = data;
}
friend ostream& operator << (ostream& os, const MYString& data) {
os << data;
return(os);
}
};
#endif
它编译得很好,但我不知道它为什么说“Segmentation fault:11”。我也不知道这意味着什么。有人能告诉我如何解决这个问题吗?而且我也是C ++的新手
(而且我也知道这段代码真的没用,但我只是想学习东西并习惯C ++)
答案 0 :(得分:8)
你有stack overflow。您的operator<<
来电operator<<
(具有相同数据的相同功能)。
答案 1 :(得分:6)
friend ostream& operator << (ostream& os, const MYString& data) {
os << data; // calls 'ostream& operator<<(ostream&,const MYstring&)' -- oops
return(os);
}
无限递归。请改用os << data.text
:
friend ostream& operator << (ostream& os, const MYString& data) {
os << data.text;
return(os);
}
答案 2 :(得分:1)
我想你可能想:
os << data.text;
在重载运算符中,以免陷入无限递归。你现在拥有的东西会不断地自我调用,直到你的筹码爆炸。
顺便说一下,我不是return(os)
的忠实粉丝,它使它看起来像一个函数调用,它肯定不是。您可以简单地执行return os
,即使是非常复杂的表达式。
在某些时候,你最终会得到数据成员几乎总是私有的顿悟,这就是封装的全部内容。没有它,C ++将是一个难以学习的C: - )
答案 3 :(得分:0)
您希望输出包含在MyString
对象中的字符串,因此您应该替换
os << data;
与
os << data.text;
这是拥有friend
功能的重点。
实际上,您进行无限递归,因为os << data;
自称为函数的<<
运算符(data
类型为MyString
)
答案 4 :(得分:0)
你应该改变os&lt;&lt;数据到os&lt;&lt; data.text