2011-12-26 25 views
11

Fintanto che nella mia domanda precedente Overloaded assignment operator causes warning about recursion emergono nuovi problemi, sono stato legittimamente invitato a pubblicarlo come nuovo. Ho un membro della classe di riferimento nella mia classe Player e voglio implementare il costruttore di copie e l'operatore di assegnazione (=) di questa classe. Devo dire che lo scopo è il buon funzionamento della funzione vector.erase perché senza di esso non funziona correttamente per quanto mi riguarda. Uso un vettore: vector allPlayers; I membri del giocatore di classe sono:Operatore di assegnazione con membro della classe di riferimento

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; 

} 

E 'obbligatorio evitare l'uso di riferimento, come membro della classe se voglio implementare l'operatore di assegnazione? E i membri della mappa? Come dovrei finalmente implementare l'operatore di assegnazione?

Un altro problema di estrema importanza di cui non sono a conoscenza è cosa succede agli oggetti puntati dai membri della classe dei puntatori quando cancello l'iteratore del vettore che contiene il Player. Qualsiasi aiuto?

+0

"Un altro problema" => un'altra domanda per i principianti :) – xtofl

+0

Cosa si desidera che l'operatore di assegnazione faccia con la Banca? – fredoverflow

+0

FredOverflow: solo per copiare la banca sull'oggetto lhs – arjacsoh

risposta

7

Vorrei astenermi dall'utilizzare un membro di riferimento quando si desidera un operatore di assegnazione. Se si utilizza un puntatore (smart), invece, si può solo fare

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

Nella situazione attuale, bank = other.bank copierà il contenuto di other.bank invece di puntare this->bank ai contenuti a cui fa riferimento other.bank.

Per quanto riguarda i membri di tipo multimap, possono essere copiati senza problemi, ma tenere presente che si otterrà una copia "profonda" delle chiavi (poiché sono di tipo string) ma un "superficiale" "copia puntatore dei valori, così si finisce con lo stato condiviso. Si potrebbe voler usare shared_ptr per i valori.

13

A C++ 'riferimento' può essere inizializzato solo, non assegnato:

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'. 

Perciò, uno scopo contenente un riferimento può essere inizializzata solo, anche!

Quindi, in effetti: se è necessario un assegnamento su una classe, quella classe non può avere variabili membro di riferimento. (Come un dato di fatto, si poteva, ma la cessione non può fare questi membri si riferiscono a un altro luogo)

Quando si pensa a questo, ha senso:

Il concetto di riferimento definisce 'un alias' per un altro variabile. L'aliasing implica che qualsiasi cosa tu faccia al tuo riferimento, in realtà lo fai alla posizione di riferimento. Quando si applica l'assegnazione a questo alias, in realtà si assegna alla posizione di riferimento. Lo scopo del riferimento andrebbe perso se tu fossi in grado di farlo puntare a una posizione diversa usando l'assegnazione.

Se quest'ultimo è quello che ti serve, dovresti usare un puntatore.

Problemi correlati