2013-03-17 1 views
1

Je suis un échantillon de D2D et celle-ci, ce code est venu:Comment puis-je déterminer si utiliser '->' par rapport à '.'

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

     Draw(); 

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

je remarquai que le m_renderTarget utilisé à la fois la -> (j'oublie ce qu'il appelle) et utilise ensuite l'opérateur point. Pour une raison quelconque, je pensais que l'utilisation ne pouvait utiliser que l'un ou l'autre selon qu'il s'agissait d'un type de référence ou d'un type de valeur. Apparemment, je pensais mal, mais ne trouve aucune information sur quand utiliser chaque opérateur (ou plus au but, le but de chaque opérateur.)

Toute précision serait grandement appréciée.

+0

Cela semble vraiment étrange. Quel est le type de m_renderTarget? –

+1

@AxelGneiting c'est loin d'être étrange, en fait il est très fréquent de regarder n'importe quel pointeur intelligent. ;) – syam

+0

Je sais ce qu'est un pointeur intelligent. Il a juste ressemblé à "Reset()" était un appel d'API sur la cible de rendu, mais c'est en fait un appel sur le pointeur intelligent. –

Répondre

6

Je pensais que l'utilisation ne pouvait utiliser l'un ou l'autre en fonction de si elle était un type

type de référence ou de la valeur En général, oui. Le fait que les deux sont utilisés sur le même objet dans votre code indique qu'il s'agit d'un "pointeur intelligent", c'est-à-dire d'un type d'objet surchargé operator-> qui lui permet d'agir comme un pointeur.

m_renderTarget->BeginDraw(); 

Il utilise le operator-> d'accéder à un membre de l'objet il pointe. BeginDraw est une fonction membre de l'objet pointé, pas de m_renderTarget.

m_renderTarget.Reset(); 

Vous accédez par ce membre de m_renderTarget lui-même, et non pas l'objet il pointe. Généralement, un membre reset() remplace l'objet pointé par un pointeur nul. Donc, dans le premier cas, la syntaxe -> fait quelque chose avec l'objet vers lequel elle pointe, et dans le second cas, la syntaxe . fait quelque chose à l'objet lui-même.

+0

Ah oui ... ça a finalement cliqué dans mon cerveau ce qui se passait. Merci. – Nate222

-1

Ce que fait l'opérateur flèche est de déférer un pointeur (pointant vers un objet), puis d'utiliser le '. 'Opérateur sur l'expression restante.

Son même que

(*m_renderTarget).BeginDraw(); 

opérateur flèche est utilisé pour éviter toute confusion avec ce

*(m_renderTarget.BeginDraw()); 

qui bien sûr pourrait être désastreux et pourrait provoquer des plantages du programme.

Cela explique un bon exemple here

+1

Ceci n'explique pas pourquoi à la fois 'operator.' et' operator-> 'sont utilisés sur le même objet (sans utiliser' operator * ') –

Questions connexes