1

私はD2Dサンプルに従っていますが、その中でこのコードが出てきました:

    if(!(D2D1_WINDOW_STATE_OCCLUDED & m_renderTarget->CheckWindowState()))
    {
        m_renderTarget->BeginDraw();

        Draw();

        if(m_renderTarget->EndDraw() == D2DERR_RECREATE_TARGET)
        {
            m_renderTarget.Reset();
            Invalidate();
        }
    }

m_renderTarget が -> (名前は忘れました) と後でドット演算子の両方を使用していることに気付きました。何らかの理由で、それが参照型であるか値型であるかに応じて、使用はどちらか一方しか使用できないと思いました。どうやら私は間違っていると思いましたが、各演算子をいつ使用するか (または、各演算子の目的) に関する情報を見つけることができません。

明確化をいただければ幸いです。

4

2 に答える 2

6

参照型か値型かによって、どちらか一方しか使用できないと思いました

通常、はい。

operator->コード内の同じオブジェクトで両方が使用されているという事実は、それが「スマート ポインター」であることを示しています。つまり、ポインターのように動作できるオーバーロードされたオブジェクト型です。

    m_renderTarget->BeginDraw();

これは、を使用しoperator->て、それが指すオブジェクトのメンバーにアクセスします。BeginDrawのメンバー関数ではなく、ポイント先のオブジェクトのメンバー関数ですm_renderTarget

    m_renderTarget.Reset();

m_renderTargetこれは、それが指すオブジェクトではなく、それ自体のメンバーにアクセスします。通常、reset()メンバーは、ポイント先のオブジェクトを null ポインターに置き換えます。

したがって、最初のケースでは、->構文はそれが指すオブジェクトに対して何かを行い、2 番目のケースでは、.構文はオブジェクト自体に対して何かを行います。

于 2013-03-17T01:26:03.647 に答える
-1

アロー演算子が行うことは、ポインター (オブジェクトを指している) を参照してから、 ' を使用することです。' 残りの式の演算子。

と同じ

    (*m_renderTarget).BeginDraw();

これとの混乱を避けるために矢印演算子が使用されます

    *(m_renderTarget.BeginDraw());

もちろん、これは悲惨なことであり、プログラムのクラッシュを引き起こす可能性があります.

これはここで良い例で説明されました

于 2013-03-17T01:18:28.073 に答える