4

長いギャップの後でcppを更新し、演算子のオーバーロードメソッドを理解しようとしています。オブジェクトのメンバーを出力するために「operator<<」をオーバーロードしようとしました。でも友達機能を使わないとできません。フレンド関数を使わない方法を探しています。

これが私のクラス定義です:

class Add{
private:
int x;

public:
friend ostream& operator<<(ostream& ostr, Add const& rhs); //Method 1
void operator<<(ostream& ostr);                //Method 2
};

関数の実装

//Method 1
ostream& operator<<(ostream &ostr, Add const& rhs)
{
    ostr<<rhs.x;

return ostr;
}

//Method 2
void Add::operator<<(ostream& ostr)
{
    cout<<" using operator<< \n";
    ostr<<x;
}

main関数からの呼び出し

cout<<Obj_Add;  //calls the Method 1

Obj_Add<<cout;  //calls the Method 2

ここで私の質問は、friend関数を使用せずにメソッド1タイプの呼び出しを実現したいということです。しかし、わからない、それはcppで可能かどうか。いくつかの実装を試しましたが、すべてコンパイルエラーが発生します。私がここで見逃している点を理解するのを手伝ってください。

4

4 に答える 4

5

クラスにパブリックアクセサ関数がある場合、または-のstreamような関数がある場合は、次のような友情は必要ありませんoperator<<

// v1
class foo{
public:
  int data() const{ return _data; }
private:
  int _data;
};

std::ostream& operator<<(std::ostream& o, foo const& f){
  return o << f.data();
}

// v2
class foo{
public:
  void stream_to(std::ostream& o){
    o << _data;
  }
private:
  int _data;
};

std::ostream& operator<<(std::ostream& o, foo const& f){
  f.stream_to(o);
  return o;
}

v2にはstream_to、関数になることができるという追加の利点があります。これは、多態的な基本クラスに役立ちます。したがって、派生クラスごとvirtualに再実装する必要はなく、。だけです。operator<<stream_to

于 2012-01-11T12:33:38.000 に答える
2

xのゲッターで可能です。

オペレーター<<が友達でない場合、メンバーxにアクセスできません

class Add {
    private:
        int x;

    public:
        int getX() { return x; }
};

//Method 1
ostream& operator<<(ostream &ostr, Add const& rhs)
{
    //ostr<<rhs.x;       //Fail: x is private

    ostr << rhs.getX();  //Good

    return ostr;
}
于 2012-01-11T12:40:08.917 に答える
1

オブジェクトから取得する他の手段がある場合は、オペレーターがフレンドとして機能することを回避できxます。

class Foo
{
private:
    int bar;

public:
    int get_bar() const { return bar; }
};

ostream &operator<<(ostream &os, const Foo &foo)
{
    os << foo.get_bar();
    return os;
}
于 2012-01-11T12:36:25.783 に答える
0

xこれは、抜け出すためのメカニズムを追加しない限り不可能です。public

// in the class
int get_x() const { return x; }

またはオブジェクトを印刷するための別のメカニズム

// outside the class
std::ostream &operator<<(std::ostream &out, Add const &obj)
{
    obj.print(out);
    return out;
}
于 2012-01-11T12:34:26.857 に答える