2009-05-16 4 views
3

내 게임 클래스의 생성자는 다음과 같습니다.C++ 개체 복사본 전달 대 개체에 포인터 전달?

// Construct a Game to be played with player on a copy of the board b. 
Game(const Board& b, Player* player) 
{ 
    ... 
} 

다음은 생성자를 사용하는 방법입니다.

Player p("Player Name"); 
Board b(6,3); 
Game g(b, &p); 

어떻게 작동합니까? b가 복사 중입니까?

플레이어에 포인터를 저장하려면 다음과 같이 private ivar를 만들어야합니까?

private: 
    Player* _player; 

... 
// In Game constructor 
_player = player; 
+0

될 것입니다 다음 '_'접두사 C의 컴파일러 공급 업체를 위해 예약되어 있기 때문에, C++로 '_'로 변수를 접두사하지 않습니다 & C++. –

+1

다음에 어떤 이름을 써야합니까? – Elliot

+0

나는 이것이 위험 할 수 있다는 것을 논평하고 싶다. (push_back을 호출 할 때 벡터가 실제로 객체의 복사 대 참조를 취하는 이유) - 예 : https://gist.github.com/nadams810/6756139. 이 코드는 VC++/gcc에서 잘 작동합니다 ...소멸자가 CC를 호출 할 때 x가 더 이상 사용 가능하지 않아야한다는 것은 무작위로 행한 것입니다. 나는 당신이 그것을 사용해서는 안되며 사용해서는 안된다는 말은 아닙니다 - 당신이 지나가고있는 것의 범위에주의하십시오. –

답변

6

참조 또는 포인터로 전달하면 복사가 수행되지 않습니다. 포인터를 저장하려면 예를 들어 포인터를 저장해야합니다.

일반적으로 할당보다는 생성자 초기화 목록을 사용하는 것이 더 좋습니다. 선호 :

Game(const Board& b, Player * player) : _player(player) 
{ 
    // do something with Board 
} 

에 :

Game(const Board& b, Player * player) 
{ 
    _player = player; 
    // do something with Board 
} 

포인터를 들어, 큰 차이가 없지만, 더 복잡한 개체에 대한, 초기화를 사용하여 할당으로 가능한 의미와 성능 문제를 방지 할 수 있습니다.

+0

상수 멤버에 할당 할 때 초기화 목록은 유일한 * 방법입니다. – Dario

2

게시판을 reference으로 전달하므로 아니요, 복사되지 않습니다. 나중에 같은 일부 코드가있는 경우

:

Board _privateBoard = b; 

그럼 당신은 B를 복사합니다. 그러나 그것은 함수에 복사되지 않습니다.

질문에 답을 얻으려면 포인터를 어딘가에 저장해야합니다.

+0

_privateBoard가 "게시판"이 아니고 "게시판"이 아닌 경우 "그렇다면 복사 하시겠습니까?" –

+0

예. 나는 명확히하기 위해 편집했다. – GManNickG

5

언급 한대로 매개 변수는 참조로 전달 될 때 복사되지 않습니다.
하지만 몇 가지 스타일 문제를 지적하고 싶습니다.

스타일을 혼용하지 마십시오. 플레이어없이 게임을 할 수 있습니까? 그렇지 않은 경우 플레이어를 참조로 전달하십시오.

다른 믹스. 하나의 매개 변수는 전체 단어로, 다른 하나는 하나의 문자로 전달합니다.

Game(const Board& board, Player& player): 
    _player(player)  
{ 
    ... 
} 

private: 
    Player& _player; 

아마 당신도 보드를 저장하는 것이 좋습니다. 게임은 보드에 대해 "알 수 있습니다".

private: 
    const Board& _board; 

는 그런 다음 생성자는 보조 노트로

Game(const Board& board, Player& player): 
    _board(board), 
    _player(player) 
{ 
    ... 
} 
+0

+1은 복사를 피하기 위해 포인터가 필요하지 않음을 지적하기 위해 - 참조도 사용할 수 있습니다. –

관련 문제