Pregunta

Estoy atrapado por un problema por el que me siento estúpido, ya que básicamente son solo dos líneas de código en medio de un script OOP de trabajo de 2000.

Corte a la persecución: tengo una clase de entidad que proporciona varias información (nombre, dirección, identificación). El problema es que, incluso si el mutador de identificación (setter) establece un valor adecuado (probado con valor de cout y retorno), el accesor siempre devuelve 0.

// ID accessor
int Entity::ID() const {
    return _ID;     
}
// ID mutator
int& Entity::ID( int newID ) {
    if ( newID >= 0 ) {
        _ID = newID;
    }
    return _ID;
}

Aquí están mis clases (el método ID (int) se llama en AgencyNetwork :: Createxxx () y se usa en cada método toStr () (al final de cada clase)):

Entidad.cpp, Agencynetwork.cpp, Agente.cpp

Resuelto: Olvidé agregar el mutador de identificación en cada operador =. Gracias a todos los que ayudaron :)

¿Fue útil?

Solución

En particular, el operador de asignación de Entity está roto:

Entity& Entity::operator= ( const Entity& tocopy ) {
    delete this; // <<< don't do that 

    this -> name ( tocopy.name() );
    this -> address ( tocopy.address() );
    // <<< missing _ID

    return *this;
}

Otros consejos

No hay magia. Hay un error simple. Entonces, usemos el rastreo: rastreemos cada llamada de 'mutador'. Asegúrese de que nadie pueda acceder al campo _id de otra manera que a través de la llamada mutadora. Constructor de rastreo, constructor de copias, operador de asignación de copias y llamadas de destructor también. Luego ejecute su código y siga el registro de rastreo. Estoy seguro de que todo quedará claro en su caso.

Nota: Si su implementación pierde algunas de las funciones de los miembros mencionadas anteriormente, debe definirlas con los cuerpos que consisten solo en llamadas trazador.

No debe dejar que el compilador haga una generación de funciones de miembro implícito para asegurarse de que tenga el control total de su clase y particularmente el _ID campo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top