2011-12-26 23 views
11

Mientras que surjan nuevos problemas de mi pregunta anterior Overloaded assignment operator causes warning about recursion, se me instó legítimamente a publicar esto como uno nuevo. Tengo un miembro de clase de referencia en mi clase Player y quiero implementar el constructor de copia y el operador de asignación (=) de esta clase. Debo mencionar que el propósito es el buen funcionamiento de la función vector.erase porque sin eso no funciona correctamente en lo que a mí respecta. Yo uso un vector: vector allPlayers; Los miembros de la clase del jugador son:Operador de asignación con el miembro de la clase de referencia

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; 

} 

¿Es obligatorio para evitar el uso de referencia, como miembro de la clase si quiero aplicar el operador de asignación? ¿Y los miembros del mapa? ¿Cómo debería implementar finalmente el operador de asignación?

Otro tema de suma importancia del que no estoy al tanto es lo que sucede con los objetos apuntados por los miembros de la clase de punteros cuando borro el iterador del vector que contiene el Reproductor. ¿Alguna ayuda?

+0

"Otro problema" => otra pregunta para principiantes :) – xtofl

+0

¿Qué quiere que haga el operador de asignación con el Banco? – fredoverflow

+0

FredOverflow: solo para copiar el banco en el objeto lhs – arjacsoh

Respuesta

7

Me abstendría de utilizar un miembro de referencia cuando desee un operador de asignación. Si utiliza un puntero (inteligente) en su lugar, sólo se puede hacer

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

En la situación actual, bank = other.bank copiará el contenido de other.bank en lugar de señalar this->bank al contenido referenciados por other.bank.

En cuanto a los miembros multimap -typed, que se puede copiar sin problemas, pero debe tener presente que obtendrá una copia "profunda" de las claves (ya que son de tipo string), pero un "poco profunda "copia de puntero de los valores, por lo que termina con estado compartido. Es posible que desee utilizar shared_ptr para los valores.

13

A C++ 'referencia' sólo puede ser inicializado, no asignada:

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

para ello, un objeto que contiene una referencia sólo puede ser inicializado, también!

De hecho, si necesita una asignación en una clase, esa clase no puede tener variables de miembros de referencia. (Como una cuestión de hecho, se podría, pero la tarea no puede hacer que estos miembros se refieren a otra ubicación)

Cuando se piensa en esto, tiene sentido:

El concepto de referencia define 'alias' para otro variable. El alias implica que cualquier cosa que hagas a tu referencia, realmente lo haces a la ubicación referenciada. Cuando aplica la asignación a este alias, en realidad lo asigna a la ubicación a la que se hace referencia. El propósito de la referencia se perdería si pudieras hacer que apuntara a una ubicación diferente mediante la asignación.

Si esto último es lo que necesita, debe usar un puntero.

Cuestiones relacionadas