Я следую примеру 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 использовал и -> (я забыл, как он называется), а затем использует оператор точки. По какой-то причине я думал, что использование может использовать только один или другой в зависимости от того, был ли это ссылочный тип или тип значения.
Очевидно, я ошибся, но не могу найти никакой информации о том, когда использовать каждый оператор (или, более точно, цель каждого оператора).
Любые разъяснения будут с благодарностью.
Я думал, что использование может использовать только один или другой в зависимости от того, был ли это ссылочный тип или тип значения
Обычно да.
Тот факт, что оба кода используются в одном и том же объекте в вашем коде, указывает на то, что это «умный указатель», то есть тип объекта с перегруженным operator->
это позволяет ему действовать как указатель.
m_renderTarget->BeginDraw();
Это использует operator->
чтобы получить доступ к элементу объекта, на который он указывает. BeginDraw
является функцией-членом указанного объекта, а не m_renderTarget
,
m_renderTarget.Reset();
Это получает доступ к члену m_renderTarget
сам, а не объект, на который он указывает. Типично reset()
элемент заменяет указанный объект нулевым указателем.
Так что в первом случае ->
синтаксис делает что-то с объектом, на который он указывает, а во втором случае .
синтаксис делает что-то с самим объектом.
То, что делает оператор стрелки, — это указатель (указывающий на объект), а затем используйте ‘. ‘Оператор на оставшееся выражение.
Это так же, как
(*m_renderTarget).BeginDraw();
Оператор стрелки используется, чтобы избежать путаницы с этим
*(m_renderTarget.BeginDraw());
что, конечно, может иметь катастрофические последствия и может вызвать сбои программы.
Это объясняется хорошим примером Вот