Как определить, использовать ли ‘- & gt;’ против ‘.’

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

Любые разъяснения будут с благодарностью.

1

Решение

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

Обычно да.

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

    m_renderTarget->BeginDraw();

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

    m_renderTarget.Reset();

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

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

6

Другие решения

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

Это так же, как

    (*m_renderTarget).BeginDraw();

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

    *(m_renderTarget.BeginDraw());

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

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

-1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector