2010-07-02 13 views
8

Estoy intentando bloquear el acceso al constructor predeterminado de una clase que estoy escribiendo. El constructor que quiero que otros utilicen requiere una referencia constante a otro objeto. He hecho que el constructor predeterminado sea privado para evitar que otros lo usen. Obtengo un error de compilación para el constructor predeterminado porque la variable miembro de referencia const no se inicializa correctamente. ¿Qué puedo hacer para hacer esta compilación?la referencia de const se debe inicializar en la lista de base de constructor/miembro inicializador

class CFoo 
{ 
public: 
    CFoo(); 
    ~CFoo(); 
}; 

class CBar 
{ 
public: 
    CBar(const CFoo& foo) : fooReference(foo) 
    { 
    } 

    ~CBar(); 

private: 
    const CFoo& fooReference; 

    CBar() // I am getting a compiler error because I don't know what to do with fooReference here... 
    { 
    } 
}; 

Respuesta

12

don`t declare default constructor. No está disponible de todos modos (automáticamente es) si declaras tu propio constructor.

class CBar 
{ 
public: 
    CBar(const CFoo& foo) : fooReference(foo) 
    { 
    } 
private: 
    const CFoo& fooReference; 
}; 

explicación bastante completa de los constructores se puede encontrar aquí: http://www.parashift.com/c++-faq-lite/ctors.html

+1

Gracias por la ayuda. Por alguna razón, pensé que el compilador generaba un constructor predeterminado incluso si no escribía uno. –

+2

@Trevor Sí lo hace, siempre que no declare explícitamente un constructor (de cualquier tipo) en su definición de clase. –

+2

@Trevor Es posible que también deba bloquear el constructor de copia. – rwong

4

La manera más fácil de crear el constructor por defecto que no utilice quiero (que es el caso con su constructor, es así?) simplemente no es la definición de ella, es decir:

class CBar 
{ 
public: 
    CBar(const CFoo& foo) : fooReference(foo) 
    { 
    } 

    ~CBar(); 

private: 
    const CFoo& fooReference; 

    CBar(); 
}; 

En este caso, puede ser un poco superflua, ya que el compilador no creará un constructor predeterminado para una clase con un miembro de referencia, pero es mejor para ponerlo allí en caso de que elimine el miembro de referencia.

Cuestiones relacionadas