2013-03-17 5 views
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 используется как -> (я забыл, как это называется), а затем использует оператор точки. По какой-то причине я думал, что использование может использовать только одно или другое в зависимости от того, был ли он ссылочным типом или типом значения. По-видимому, я ошибся, но не могу найти информацию о том, когда использовать каждого оператора (или более того, цель каждого оператора.)

Любые разъяснения были бы весьма признательны.

+0

Это выглядит действительно странно. Какой тип m_renderTarget? –

+1

@AxelGneiting это далеко не странно, на самом деле это очень распространено, просто посмотрите на любой умный указатель. ;) – syam

+0

Я знаю, что такое умный указатель. Он просто выглядел так: «Сброс()» - это какой-то вызов API для цели рендеринга, но на самом деле это вызов интеллектуального указателя. –

ответ

6

Я думал, что использование может использовать один или другой в зависимости от того, если это ссылочный тип или тип значения

Обычно только, да.

Тот факт, что оба используются на одном и том же объекте в вашем коде, указывает, что это «умный указатель», то есть тип объекта, который имеет перегруженный operator->, который позволяет ему действовать как указатель.

m_renderTarget->BeginDraw(); 

Это использует operator-> для доступа к элементу объекта он указывает. BeginDraw - это функция-член объекта с заостренным объектом, а не m_renderTarget.

m_renderTarget.Reset(); 

Это обращается к члену m_renderTarget само по себе, а не объекта, он указывает. Обычно член reset() заменяет заостренный объект нулевым указателем.

Итак, в первом случае синтаксис -> делает что-то с объектом, на который он указывает, а во втором случае синтаксис . что-то делает для самого объекта.

+0

Ах да ... он наконец нажал в моем мозгу то, что происходило. Благодарю. – Nate222

-1

То, что делает оператор стрелки, является указателем на указатель (указывает на объект), а затем использует символ '. 'Оператора на оставшееся выражение.

Его оператор Стрелка же, как

(*m_renderTarget).BeginDraw(); 

используется, чтобы избежать путаницы с этим

*(m_renderTarget.BeginDraw()); 

, который, конечно, может иметь катастрофические последствия и может вызвать сбой программы.

Это объясняется хорошим примером here

+1

Это не объясняет, почему и 'operator.', и' operator-> 'используются на одном и том же объекте (без использования' operator * ') –