C ++分段错误:11,尝试重载运算符<<

时间:2013-03-08 22:03:47

标签: c++ segmentation-fault runtime-error

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

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 ++)

5 个答案:

答案 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