2

我正在尝试重载此类中的 << 运算符,但这是输出:

Hello, 
Segmentation fault: 11

这是我的代码:

测试.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

它编译得很好,但我不知道为什么它说“分段错误:11”。我也不知道那是什么意思。有人可以告诉我如何解决这个问题吗?而且我对 C++ 也很陌生

(而且我知道这段代码真的毫无意义,但我只是想学习一些东西并习惯 C++)

4

5 回答 5

8

你有一个堆栈溢出。您的operator<<电话operator<<(具有相同数据的相同功能)。

于 2013-03-08T22:07:58.647 回答
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);
}
于 2013-03-08T22:07:47.697 回答
1

我想你可能想要:

os << data.text;

在您的重载运算符中,以免陷入无限递归。你目前拥有的只会不断地调用自己,直到你的堆栈爆炸。


顺便说一句,我不是 . 的忠实粉丝return(os),它让它看起来像一个函数调用,但它绝对不是。你可以简单地做return os,即使是非常复杂的表达式。

在某些时候,您最终会顿悟数据成员几乎应该始终是私有的,这就是封装的全部意义所在。没有它,C++ 将只是一个更难学习的 C :-)

于 2013-03-08T22:09:03.347 回答
0

你想输出包含在你的MyString对象中的字符串,所以你应该替换

os << data;

os << data.text;

这就是拥有friend功能的全部意义所在。

实际上,您进行了无限递归,因为os << data;将自己称为<<函数的运算符(data属于 type MyString

于 2013-03-08T22:08:04.230 回答
0

您应该将 os << data 更改为 os << data.text

于 2013-03-08T22:10:09.583 回答