2017-10-28 8 views
0

私はstd :: stringを代入に使用できないため、私は自分で初期化できないケースのラッパーとしてCharStringというカスタムクラスを使用しています。私はそれを>>使用したいとき、私は次のエラーを取得するしかしオペレータ>> charポインタラッパーの場合

struct CharString { 
    char* str; 
    CharString() : str() {} // Initialize NULL 
    ~CharString() { free(str); } 
    // Conversions to be usable with C functions 
    operator char**() { return &str; } 
    operator char*() { return str; } 
}; 

クラスは次のようになります。

binary '>>': no operator found which takes a right-hand operand of type 'utils::CharString' (or there is no acceptable conversion). 

オペレータをどのようにオーバーロードできますか>>

CharString operator>>(std::istream& is) { 
    is >> str; 
    return *this; 
}; 

私は上記を試みましたが、それでも私には同じエラーが表示されます。

答えて

1

ストリーム抽出演算子をオーバーロードする一般的な方法は、この一般的な形式で友人の機能を提供するものです。この関数のシグネチャは、あなたが書いたものとは異なることになるだろうということ

istream& operator>> (istream& in, MyObjectType& object) { 
    // read all the data you need to construct an object. 
    // 
    // Then: 
    if (in) { // Read succeeded! Update object. 
     // Build a new object of the appropriate type. 
     MyObjectType theOneIRead(basedOnTheDataIRead); 

     // Swap the object you were given as input for the one you 
     // just read. This way, if the read completely succeeds, you 
     // update the rhs, and if the read failed, nothing happens. 
     std::swap(object, theOneIRead); 
    } 
    return in; 
} 

注意してください。

ストリームから一度に1文字を読み込み、それらを保持するための一時的なバッファを構築するロジックに注意する必要があります。それは自明ではないし、std::stringタイプがライブラリにパッケージされていることがとてもうれしい理由の1つです。しかしそれ以外に、以下のテンプレートに従うことで、あなたが望むものが得られるはずです。

独立して、構造体には現在デストラクタがありますが、コピーコンストラクタ、移動コンストラクタ、または代入演算子はありません。通常、オブジェクトをコピーすると、ポインタのシャローコピーが終了し、2つの独立したオブジェクトが同じポインタを解放しようとすると、メモリの問題が発生するため、デストラクタの横にこれらの関数を実装することもできます。

さらに、これはC++であるため、mallocfreeではなく、new[]とを使用することを検討してください。

+0

私はこれを私のCharString構造体に配置する必要があると仮定しますが、これは私にもエラーを与えます:istreamのみを使うとき ''戻り値の型だけで区別される関数を多重定義できません。 。 – IMarks

+1

これはメンバ関数ではなくfriend関数でなければなりません。あなたのクラスの外にそれを宣言して、クラスの中でそれのための友人宣言を追加してください。 – templatetypedef

関連する問題