2011-12-26 15 views
11

Dopóki pojawiają się nowe problemy z mojego poprzedniego pytania Overloaded assignment operator causes warning about recursion, Prawidłowo wezwano mnie do opublikowania tego jako nowego. Mam klasy odniesienia klasy w mojej klasie Player i chcę zaimplementować konstruktora kopiowania i operator przypisania (=) tej klasy. Muszę wspomnieć, że celem jest poprawne działanie funkcji vector.erase, ponieważ bez niej nie działa ona właściwie tak daleko, jak mnie to dotyczy. Używam wektora: vector allPlayers; Członkowie klasy Gracze to:Operator przydziału z referencyjnym członkiem klasy

class Player 
{ 

    private: 
    int ID; 
    int pMoney; 
    int doubleIndicator; 
    int squarePosition; 
    Bank& bank; 
    string pName; 
    Square* capturedSquare; 
    multimap<string, PropertySquare*> squaresColBought; 
    multimap<string, House*> housesColBuilt; 

} 

Czy korzystanie z referencji jako członka klasy jest obowiązkowe, jeśli chcę wdrożyć operatora przypisania? A co z członkami mapy? Jak powinienem w końcu wdrożyć operatora przypisania?

Inną kwestią o ogromnym znaczeniu, której nie jestem świadomy, jest to, co dzieje się z przedmiotami wskazywanymi przez wskaźniki członków klasy, kiedy usuwam iterator wektora, w którym znajduje się odtwarzacz. Jakaś pomoc?

+0

"Kolejna kwestia" => kolejne pytanie na początek :) – xtofl

+0

Co chcesz, aby operator przypisania miał do czynienia z bankiem? – fredoverflow

+0

FredOverflow: Wystarczy skopiować bank do obiektu Lhs – arjacsoh

Odpowiedz

7

Powstrzymałbym się od korzystania z elementu referencyjnego, gdy chce się operatora przypisania. Jeśli używasz (Smart) wskaźnik zamiast tego można po prostu zrobić

Player &operator=(Player const &other) 
{ 
    bankPtr = other.bankPtr; 
    // copy other members 
} 

w obecnej sytuacji, bank = other.bank skopiuje zawartość other.bank zamiast wskazując this->bank do zawartości odwołuje other.bank.

chodzi o multimap -typed członków, mogą być kopiowane bez problemów, ale należy pamiętać, że dostaniesz „głębokie” kopię kluczy (ponieważ są one typu string) ale „płytkie "wskaźnikowa kopia wartości, dzięki czemu otrzymasz stan współdzielony. Możesz użyć wartości shared_ptr.

13

C++ „odniesienia” można zainicjować tylko niewyznaczone:

int value1(1), value2(2); 
int& ref1 = value1; // OK 
int& ref2; // compile error: reference not initialized 
int& ref3=ref1; // OK: ref3 refers to the same variable as ref1 
ref1=value2; // equivalent to 'value1=value2'. 

do nich przedmiotu zawierający odniesienie można zainicjować tylko za!

Tak naprawdę: jeśli potrzebujesz przypisania na klasie, ta klasa nie może mieć zmiennych składowych odniesienia. (W rzeczywistości, to może, ale zadanie nie może ci członkowie odnoszą się do innej lokalizacji)

Kiedy myślisz o tym, to ma sens:

Koncepcja odniesienia definiuje „alias” dla innego zmienna. Aliasing oznacza, że ​​wszystko, co robisz do swojego odniesienia, faktycznie robisz do wskazanej lokalizacji. Kiedy zastosujesz przypisanie do tego aliasu, faktycznie przypisujesz do wskazanej lokalizacji. Cel odniesienia zostałby utracony, gdybyś mógł wskazać inną lokalizację za pomocą przydziału.

Jeśli to ostatnie jest to, czego potrzebujesz, powinieneś użyć wskaźnika.

Powiązane problemy