2

このクラスで<<演算子をオーバーロードしようとしていますが、これは出力です。

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

正常にコンパイルされますが、なぜ「セグメンテーション違反: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;呼び出すため、無限再帰を実行します。<<dataMyString

于 2013-03-08T22:08:04.230 に答える
0

os<<dataをos<<data.textに変更する必要があります

于 2013-03-08T22:10:09.583 に答える