Pasar una variable por referencia a otra clase

Estoy tratando de pasar una variable por referencia a una clase diferente, pero no puedo hacer que funcione.

Tengo un objeto de configuración que creo en la aplicación principal, luego, cuando ejecuto el cuadro de diálogo de configuración, quiero proporcionar este objeto de configuración al cuadro de diálogo.

Esto es lo que tengo hasta ahora:

ConfigDialog.h:

class ConfigDialog {

public:
    explicit ConfigDialog(kimai::Config& config, QWidget *parent = 0);

private:
    kimai::Config& config_;
};

ConfigDialog.cpp:

ConfigDialog::ConfigDialog(kimai::Config& config, QWidget *parent) {        
    config_ = config;
    // Do something with config_ - get/set values, etc.
}

Cuando intento compilar, aparece el siguiente error:

ConfigDialog.cpp:7: error: C2758: 'ConfigDialog::config_' : must be initialized in constructor base/member initializer list

¿Alguna idea de cómo solucionar este problema?

(Intenté agregar config_ = config a la lista de inicialización pero esto no es válido)

preguntado el 22 de mayo de 12 a las 10:05

5 Respuestas

No puede inicializar una referencia por asignación, debe hacerse en la lista de inicializadores:

ConfigDialog::ConfigDialog(kimai::Config& config, QWidget *parent) : config_(config) {        
    // Do something with config_ - get/set values, etc.
}

La config_ = config asignación es una llamada del operador de asignación sobre el valor al que hace referencia config en la variable a la que hace referencia config_, que no está inicializado. La sintaxis de asignación funciona solo cuando se combina con la declaración:

int y = 5;
int &x = y;    // This works
int &z; z = y; // This does not work!
int w = 4;
x = y;         // This is an assignment to y through a reference

contestado el 22 de mayo de 12 a las 10:05

Debe usar la lista de inicializadores para inicializar una referencia:

ConfigDialog::ConfigDialog(kimai::Config& config, QWidget *parent) 
        : config_(config)
{        
    // Do something with config_ - get/set values, etc.
}

contestado el 22 de mayo de 12 a las 10:05

Tienes que usar una lista de inicializadores de constructores:

ConfigDialog::ConfigDialog(kimai::Config& config, QWidget *parent)
    : config_(config)
{
}

contestado el 22 de mayo de 12 a las 10:05

Pero no lo haría config_(config) crear una copia de config? - laurent

@Laurent No, solo copia el referencia que es lo que quieres. - Algún tipo programador

El mensaje de error te dijo todo. Prueba esto:

ConfigDialog::ConfigDialog(kimai::Config& config, QWidget *parent) 
   :config_(config)
{           
    // Do something with config_ - get/set values, etc.
}

Los miembros de clase de tipo de referencia deben inicializarse en el listas de inicialización.

contestado el 22 de mayo de 12 a las 10:05

Debe agregarlo a la lista de inicialización usando la sintaxis del constructor:

ConfigDialog::ConfigDialog(kimai::Config& config, QWidget *parent)
    : config_ (config)
{        
    // Do something with config_ - get/set values, etc.
}

contestado el 22 de mayo de 12 a las 10:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.