2009-05-16 3 views
3

Hier ist ein Konstruktor für meine Spielklasse:C++ Eine Kopie eines Objekts übergeben oder einen Zeiger an ein Objekt übergeben?

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

Hier ist, wie ich den Konstruktor bin mit:

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

Wie funktionierts? Wird b kopiert?

Wenn ich einen Zeiger auf den Player speichern möchte, sollte ich einen privaten Ivar wie den folgenden erstellen?

private: 
    Player* _player; 

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

Als Randbemerkung sein: Präfix nicht Ihre Variablen mit ‚_‘ in C++, da der ‚_‘ Präfix für den Compiler-Anbieter in C reserviert & C++. –

+1

Welchen Namen sollte ich dann verwenden? – Elliot

+0

Ich möchte kommentieren, dass dies gefährlich sein könnte (weshalb Vektor tatsächlich eine Kopie des Objekts macht vs eine Referenz aufnehmen, wenn Sie push_back aufrufen) - Beispiel https://gist.github.com/nadams810/6756139. Dieser Code funktioniert gut auf VC++/gcc ...aber das ist nur zufällig, da der Destruktor für CC aufgerufen wurde, also sollte x nicht mehr verwendbar sein. Ich sage nicht, dass Sie es benutzen sollten oder sollten - achten Sie nur auf den Umfang dessen, was Sie herumreichen. –

Antwort

6

Wenn Sie nach Referenz oder Zeiger übergeben, wird keine Kopie erstellt. Wenn Sie einen Zeiger speichern möchten, dann ja, Sie müssen irgendwo speichern.

Beachten Sie, dass es in der Regel besser ist, Konstruktorinitialisierungslisten als Zuweisungen zu verwenden. bevorzugen:

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

zu:

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

für Zeiger, gibt es keinen großen Unterschied, aber für komplexere Objekte, Initialisierung mit vermeidet mögliche semantische und Performance-Probleme mit der Zuordnung.

+0

Bei der Zuweisung zu konstanten Mitgliedern ist die Initialisierungsliste * der einzige Weg. – Dario

2

Sie übergeben die Platine von reference, also nein, es wird nicht kopiert.

Wenn Sie einen Code haben später wie:

Board _privateBoard = b; 

Dann Sie kopieren b. Aber es wird nicht in die Funktion kopiert.

Wie für Ihre Frage, ja müssen Sie den Zeiger irgendwo speichern, wenn Sie es zurückbekommen möchten.

+0

"Dann kopieren Sie b" wenn _privateBoard ein "Board" ist und kein "Board &", nein? –

+0

Yup. Ich habe es bearbeitet, um zu klären. – GManNickG

5

Wie erwähnt wurde, wird der Parameter nicht kopiert, da er als Referenz übergeben wurde.
Aber ich möchte auf einige Stilprobleme hinweisen.

Mischen Sie nicht Ihren Stil. Ist es möglich, ein Spiel ohne einen Spieler zu spielen? Wenn nicht, übergeben Sie den Player an der Referenz.

Ein anderer Mix. Ein Parameter übergeben Sie als das ganze Wort und andere als einen Buchstaben.

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

private: 
    Player& _player; 

Und möglicherweise möchten Sie das Board auch speichern, wie es sinnvoll ist. Das Spiel kann über das Brett "wissen".

private: 
    const Board& _board; 

Dann wird Ihr Konstruktor

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

+1 für den Hinweis, dass kein Zeiger erforderlich ist, um das Kopieren zu vermeiden - Referenzen können ebenfalls verwendet werden. –