2016-06-21 12 views
1

文字列用のwrapperClassを作成したいとします。私はまた、クラスはwrapperClassと保存(ラップ)文字列のアドレスのアドレスを返すことができるようにしたい:ここ多くの型キャスト演算子のオーバーロードを使用するとあいまいなオーバーロード

void FunctionString(string*); 
void FunctionWrappedString(wrappedString*); 

int main(){ 
    wrappedString wrappedStringObject; 

    FunctionString(&wrappedStringObject); 
    FunctionWrappedString(&wrappedStringObject); 

    wrappedString anotherWrappedStringObject; 

    if(wrappedStringObject == anotherWrappedStringObject){ 
    // code 
    } 
} 

は、クラスの重要な部分です:

class wrappedString{ 
    typedef char* string; 

    string storedString; 

    operator string*(){ 
     // some code 
     return &storedString; 
    } 

    operator wrapperString*(){ 
     // some code 
     return this; 
    } 

    operator string(){ 
    // some code 
    return storedString; 
    } 

}そのトンを言っ

if(wrappedStringObject == anotherWrappedStringObject){ 
    // code 
} 

:私は比較演算子を使用するときに

しかしこれらは失敗します演算子==(文字列、文字列)と演算子==(文字列*、文字列*)

+1

いくつかのフレンドリーアドバイス - キャスト演算子が多すぎると、これを正常にコンパイルしても、多くの予期しない問題が発生します。期待していなかったコードなどのものは、そのうちの1つです。 'std :: string'を返すには、' string() 'へのキャストの代わりに' get_string'を呼び出してください。 – PaulMcKenzie

+0

@PaulMcKenzie:あるいは、キャスト演算子を定義しますが、すべての(または1つまたは2つを除くすべての)ケースを「明示的」にします(C++ 11が必要です)。 '明示的な演算子std :: string *'、 '明示的な演算子std ::文字列'など – ShadowRanger

+2

サイドノート: 'typedef char * string;'?!?どうして?これは、ユーザーの間違いを混乱させる素晴らしい方法です。 'if(wrappedStringObject == anotherWrappedStringObject)'は、動作しても、同じ_contents_を持つ文字列へのポインタではなく、同じ2つの 'char *'が同じ_メモリアドレスへのポインタであることをテストします。 – ShadowRanger

答えて

0

複数の暗黙のキャスト演算子がこの問題を引き起こしています。ラップされたstringオブジェクトがstring(実際にはchar*?!?)のように振る舞うようにする場合は、暗黙のキャスト演算子を1つだけ許可し、残りはexplicitのままにして、誤動作の危険性を減らします。これが唯一のC++ 11では動作するのですが、とにかく今であることを利用してしなければならない:その定義と

class wrappedString{ 
    typedef char* string; 

    string storedString; 

    explicit operator string*(){ 
     // some code 
     return &storedString; 
    } 

    explicit operator wrapperString*(){ 
     // some code 
     return this; 
    } 

    operator string(){ 
    // some code 
    return storedString; 
    } 

} 

if(wrappedStringObject == anotherWrappedStringObject){string過負荷、ないstring*オーバーロードを使用します。

関連する問題