文字列用の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つです。 'std :: string'を返すには、' string() 'へのキャストの代わりに' get_string'を呼び出してください。 – PaulMcKenzie
@PaulMcKenzie:あるいは、キャスト演算子を定義しますが、すべての(または1つまたは2つを除くすべての)ケースを「明示的」にします(C++ 11が必要です)。 '明示的な演算子std :: string *'、 '明示的な演算子std ::文字列'など – ShadowRanger
サイドノート: 'typedef char * string;'?!?どうして?これは、ユーザーの間違いを混乱させる素晴らしい方法です。 'if(wrappedStringObject == anotherWrappedStringObject)'は、動作しても、同じ_contents_を持つ文字列へのポインタではなく、同じ2つの 'char *'が同じ_メモリアドレスへのポインタであることをテストします。 – ShadowRanger