2011-02-27 6 views
2

私は次のコードスニペットを見た:ここC++ - どのようにユーザー定義演算子を呼び出すには?

class WindowHandle { 
public: 
    WindowHandle(WINDOW_HANDLE handle) : w(handle) {} 
    ~WindowHandle() { destoryWindow(w); } 

    operator WINDOW_HANDLE() { return w; } 
    ... 

private: 
    WINDOW_HANDLE w; 
    ... 
} 

は質問です:どのように私は生のポインタを取得するために)(オペレータWINDOW_HANDLEを使用していますか?

WINDOW_HANDLE winPtr = static_cast<WINDOW_HANDLE>(win); 
+0

このコードは有効なC++ですか? –

+0

@ alpha123 - 型のマクロを持つキャスト演算子のようです... – Flexo

+0

私はWINDOW_HANDLEを作成しました。winPtr = win.operator WINDOW_HANDLE()このユーザー定義演算子を使用する方法を理解しようとします。 – q0987

答えて

6

は単に

WINDOW_HANDLE winPtr = win; 

が十分にある: ​​

は、それはあなたがキャストすることができます

+0

こんにちはベン、WindowHandleクラスで複数のユーザ定義演算子が定義されていて、コンパイラがどれを選択するかを知っていたらどうなりますか? - ありがとう – q0987

+1

@ q0987:これは、C++が過負荷解決で戻り値の型を使用する唯一のケースです。 –

+0

@ q0987 - 割り当て/変換のために適切なものを選択します。 – Flexo

3

ありがとう:次のように私は私の推測をリストアップ。ユーザー定義演算子は暗黙の変換を作成します。

+2

キャストは必要でないときには使用しないでください。何か問題があった場合にコンパイラが警告を出さないようにします。ここにはキャストの有無にかかわらず警告はありません。 –

+0

うわー、これは私の答え:)誰も確認する必要がありますか? – q0987

+0

@Ben、あなたは絶対に正しいです。本の作者が述べたように、この種のコードは避けるべきです。 - ありがとう – q0987

0

表示するコードの目的は、自動的にハンドルを閉じることです。したがって、WINDOW_HANDLEを作成し、それをラッパークラスに入れて閉じます。

主な問題は、暗黙的なコンストラクタを持ち、オーバーロードされたコピーコンストラクタまたは代入演算子がなく、そのデストラクタによってハンドルが破棄されることです。

したがって、この実装では問題が発生する可能性があります。

オペレータWINDOW_HANDLEの目的は、実際にはWINDOW_HANDLEが必要な関数にWindowHandleを渡すことができるようにすることです(これは正当なThiefMasterです。暗黙の変換です)。変換はconstメソッドでなければなりません。 (結局、参照を渡していません)。

言語はあなたにこのような機能を与えていますが、使用しないことをお勧めします。 get()の方法が好ましい。

boost::unique_ptrをコピー可能にする必要がない場合はこのようなコードを記述する必要はありません。そうした場合はboost :: shared_ptrを使用する必要があります。どちらの場合でも、deleter関数、この場合DestroyWindow

+0

コピーコンストラクタと代入演算子については間違いありません。 OTOHの質問者はScott Meyerのコードスニペットを使用していると言いました。スコット・メイヤーは3つのルールをよく知っていますので、それらが省略記号で隠されていると思われます。格納された値がポインタ型ではないので、スマートポインタクラスがこれをどのように処理するのかはわかりません。テンプレートの実際のパラメータをどのように選択しますか? –