2009-08-09 12 views
2

独自のstd :: stringラッパーを作成して機能を拡張しようとしています。 しかし、< <演算子を宣言するときに問題が発生しました。 はここで、これまでに私のコードです:C++のカスタム文字列クラスの<<演算子関数の戻り値

私のカスタム文字列クラス:

class MyCustomString : private std::string 
{ 
public: 
    std::string data; 
    MyCustomString() { data.assign(""); } 
    MyCustomString(char *value) { data.assign(value); } 
    void Assign(char *value) { data.assign(value); } 
    // ...other useful functions 
    std::string & operator << (const MyCustomString &src) { return this->data; } 
};

メインプログラム:私はそのようにはstd ::文字列としてクラスを扱うためにはcoutたかっ

int main() 
{ 
    MyCustomString mystring("Hello"); 
    std::cout << mystring; // error C2243: 'type cast' : conversion from 'MyCustomString *' to 'const std::basic_string<_Elem,_Traits,_Ax> &' exists, but is inaccessible 

    return 0; 
}

私は次のようなことをする必要はありません:

std::cout << mystring.data;

何か助けていただければ幸いです!

ありがとうございました。

ただfyi:私のIDEはMicrosoft Visual C++ 2008 Express Editionです。

+0

私は追加している:あなたは新しい文字列クラスを実装していて、それがstd::coutを使用して出力することができるようにしたい、あなたはstd::coutを期待文字列データを返すために、キャスト演算子が必要になりますと仮定

他の答えには、自立型(グローバル関数)が必要なのは、最初の引数の型が 'std :: string'か、' << '演算子の前に持ちたい型にする必要があるからです。 – Skurmedel

+0

...これは、実際のstd :: stringクラスを変更することなく、そのような演算子を提供する唯一の方法です。 – Skurmedel

答えて

1

まず、MyCustomStringの定義に問題があるようです。これはstd::stringから個人的に継承され、std::stringというインスタンスも含まれます。私はどちらか一方を削除します。

operator const char *() 
{ 
    return this->data.c_str(); 
} 
4

あなたはすべてのストリーム演算子は、それらの形式は宣言されているかを見れば:

ostream& operator<<(ostream& out, const someType& val); 

は基本的に、あなたのオーバーロードされた関数は、実際に出力動作を行い、その後、更新された新しいストリーム演算子を返すようにしたいです。私は何をやってことをお勧めすることは以下の通りです、これはグローバル関数ではなく、自分のクラスの一員であることに注意してください:

ostream& operator<< (ostream& out, const MyCustomString& str) 
{ 
    return out << str.data; 
} 

なお、あなたの「データ」オブジェクトは、基本的なOOPは、それはおそらくべき言うた、プライベートであれば、上記の演算子を内部的に 'friend'関数として宣言することができます。これにより、プライベートデータ変数にアクセスできます。

+0

良い点。または、アクセサー機能を使用することもできます。 – jkeys

1

あなたは< <演算子をオーバーロードする方法はありません。 ostreamへの参照を渡して返す必要があります(std::cout << lol << lol2のように< <を複数スタックすることができます)。

ostream& operator << (ostream& os, const MyCustomString& s); 

それからちょうど次の操作を行います。(!あなたはおそらく必要としてあなたのdataをプライベートにする場合は、あなたのクラスの友人、)

ostream& operator << (ostream& os, const MyCustomString& s) 
{ 
    return os << s.data; 
} 
2

あなたが自立機能を必要とする

inline std::ostream & operator<<(std::ostream &o, const MyCustomString&& d) 
{ 
    return o << d.data; 
}