質問

構造体を使用するクラスがあり、<<をオーバーロードしたいその構造体の演算子、ただしクラス内のみ:

typedef struct my_struct_t {
  int a;
  char c;
} my_struct;

class My_Class
{
  public:
    My_Class();
    friend ostream& operator<< (ostream& os, my_struct m);
}

演算子を宣言するときのみコンパイルできます&lt;&lt; friendキーワードでオーバーロードしますが、演算子はクラス内だけでなくコード内のどこでもオーバーロードされます。 &lt;&lt;をオーバーロードするにはどうすればよいですかクラス内でのみmy_structの演算子ですか?

編集:オーバーロードされた演算子を使用して、My_Classのメンバーであるmy_structを出力します

役に立ちましたか?

解決

  

&lt;&lt;をオーバーロードするにはどうすればよいですかクラス内でのみmy_structの演算子ですか?

定義する

static std::ostream & operator<<( std::ostream & o, const my_struct & s ) { //...

または

namespace {
    std::ostream & operator<<( std::ostream & o, const my_struct & s ) { //...
}

MyClass を実装する .cpp ファイル内。

編集:本当にクラスにスコープを設定する必要があり、他に何も設定する必要がない場合は、クラスでプライベート静的関数として定義します。それはそのクラスとサブクラスのスコープ内にのみ存在します。ただし、ADLで見つからない場合、またはADLのメンバーである場合を除き、無関係なクラスに対して定義されている他のすべてのカスタム operator&lt;&lt; は非表示になります(クラス内およびサブクラスのみ)。 std :: ostream は既に。

他のヒント

演算子&lt;&lt;を使用しないでください。名前付きメンバー関数を使用して、プライベートにします。

class My_Class
{
  public:
    My_Class();
 private:
    void Print( ostream & os, const my_struct & m );
};

使用する方法にかかわらず、構造体をconst参照として渡す必要があることに注意してください。

編集:演算子を&lt;&lt;にする必要はありません。クラスのメンバーを印刷するために使用できるように、クラスのメンバー。構造体のフレンド、またはクラスが使用する完全に無料の関数にすることができます。

&quot; My_Classでのみオーバーロードされた場合&quot;私のクラスでのみ可視/使用可能という意味で、My_Classにのみ可視の非メンバーオーバーロードを使用できます。例:

   struct my_struct {
      int a;
      char c;
   };

   class My_Class
   {
      publiC:
         My_Class();
   }

次にMy_Class.cppで:

namespace {
    ostream& operator(ostream& os, const my_struct& mystruct ) {
         os << mystruct.a << mystruct.c;
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top