2014-11-10 9 views
2

내 DirectX Graphics 클래스를 사용하여 서페이스를 만들고 스프라이트를 그릴 수있는 플레이어 클래스가 있습니다.클래스 멤버에 포인터 클래스 인수를 복사 할 때의 이점은 무엇입니까?

나는 플레이어 클래스 methodlike이 포인터로 그래픽 클래스를 통과 오전 : 내 초기화 방법은 다른 포인터 방법에 대한 포인터를 전달

**game.cpp** 
m_pPlayer->Init(Graphics* graphics); 

플레이어 클래스 내부. 플레이어 클래스에 다른 그래픽 포인터를 만들고 대신 포인터 인수를 복사하면 어떤 이점이 있습니까?

그래서이 대

**player.cpp** 
m_pSurface->Init(graphics, m_width, m_height); 

:

**player.cpp** 
m_pGraphics = graphics; 
m_pSurface->Init(m_pGraphics, m_width, m_height); 

나는 m_pGraphics 포인터를 갖는 날 같은 클래스에 다시 포인터를 재사용 할 수 있음을 알고 같은 내 그리기 방법하지만 같은 어쨌든 플레이어 클래스의 메서드를 호출하면 포인터를 계속 반복해서 전달할 수 없습니까?

+0

예, 그냥 전달할 수 있습니다. 복사가 더 느리고 더 많은 메모리와 코드가 필요하므로 필요하지 않은 경우 ... – deviantfan

+2

이 두 코드 단편은 절대적으로 동일합니다. 하나를 다른 것보다 선호하는 이유가 없습니다. 포인터 복사는 매우 저렴하며 어쨌든 최적화 할 수 있습니다. 아마 당신은'그래픽'과'그래픽'을 혼동하고있을 것입니다. 후자는 복사해서는 안됩니다 (아마 어쨌든 허용되지 않을 것입니다). –

+0

Offtopic. 클래스 디자인의 문제. 아마도 플레이어 클래스에 "서피스"또는 "그래픽"에 대한 모든 지식을 포함시키지 않기를 원할 것입니다. 그리고 아마도 "Init"메소드 대신에 생성자를 사용하고 싶을 것입니다. 원시 포인터와 포인터를 일반적으로 사용하는 것도 다시 고려해야합니다. – Drop

답변

0

이것은 스타일의 문제 일 뿐이며 성능에 영향을 미치지 않습니다. 포인터를 복사하는 것은 매우 싸다. 나는 그것을 최적화하기 위해 컴파일러에 맡길 것이다.

playerGraphics 개체를 많이 사용하는 경우 항상 포인터를 전달하는 대신 멤버 변수에 포인터를 저장하는 것이 좋습니다. player에있는 구성원 함수 서명을 더 짧게 만들 수 있습니다.

Graphics 개체에 대한 구성원 포인터가 사용될 때마다 유효해야합니다. 여전히 올바른 Graphics 개체입니까? 아직 살아 있습니까? 이 복잡성이 없을 때마다 포인터를 전달하면됩니다.

+0

고맙습니다. if (포인터 == NULL) {return false; } 포인터를 매번 유효성을 검사합니다. 복사 포인터가 효율적이라면 사용할 좋은 프로그래밍 스타일 인 것처럼 보입니다. – balldrix

+0

예, 포인터 유형이 있기 때문에 C++ 11에서'NULLptr' 대신에'nullptr'을 사용하는 것이 더 좋습니다. 'nullptr' 검사는 삭제 된 객체에 대한 포인터로부터 당신을 보호하지 못한다는 것에주의하십시오. –

+0

원시 포인터를 복사하는 것은 실제로 저렴하지만 스마트 포인터를 복사하는 것은 아닐 수도 있습니다. 원시 포인터를 사용하는 것은 큰 프로그램에서 문제가되기 때문에''std :: shared_ptr'',''std :: unique_ptr'',''Microsoft :: WRL :: ComPtr'' 등과 같은 것들이 적절한 소유권과 정리를 보장합니다 자원의상수 참조 (즉''const &'')로 스마트 포인터를 전달하거나 포인터의 소유권을 얻지 않을 원시 포인터를 전달하여이를 해결할 수 있습니다. 이에 대한 예는 [DirectX Tool Kit] (http://go.microsoft.com/fwlink/?LinkId=248929)를 참조하십시오. –