2011-10-13 15 views
15

¿Puedo llamar al constructor de un miembro en el constructor de mi clase?llamando al constructor de un miembro de la clase en el constructor

deja decir Si tengo un miembro bar del tipo de clase foo en mi clase MClass. ¿Puedo llamar al constructor de la barra en el constructor de MClass? Si no es así, ¿cómo puedo inicializar mi barra de miembros?

Es un problema de inicialización de miembros en la composición (agregación).

Respuesta

26

Sí, sin duda puede! Para eso sirve la lista de inicializadores del constructor . Esta es una característica esencial que se necesita para inicializar los miembros que no tienen constructores por defecto, así como constantes y referencias:

class Foo 
{ 
    Bar x;  // requires Bar::Bar(char) constructor 
    const int n; 
    double & q; 
public: 
    Foo(double & a, char b) : x(b), n(42), q(a) { } 
    //      ^^^^^^^^^^^^^^^^^^^ 
}; 

Es necesario aún más la lista de inicialización para especificar un constructor no predeterminado para las clases de bases de constructores de clase derivados.

3

De esta manera:

class C { 
    int m; 

public: 

    C(int i): 
    m(i + 1) {} 

}; 

Si su constructor miembro quiere parámetros, se puede pasar a ellos. Pueden ser expresiones hechas a partir de los parámetros de constructor de clase y tipos ya inicializados.

Recuerde: los miembros se inicializan en el orden en que se declaran en la clase, no en el orden en que aparecen en la lista de inicialización.

2

Sí, puedes. Esto se hace en la lista de inicialización de su clase. Por ejemplo:.

class MClass 
{ 

    foo bar; 

public: 

    MClass(): bar(bar_constructor_arguments) {}; 
} 

Esto construirá bar con los argumentos pasados ​​Normalmente, los argumentos serán otros miembros de su clase o argumentos que se pasa a su constructor. Esta sintaxis es necesaria para cualquier miembro que no tenga constructores sin argumento.

3

A través de la lista de inicializadores, si la clase base no tiene un constructor predeterminado.

struct foo{ 
    foo(int num) 
    {} 
}; 

struct bar : foo { 
    bar(int x) : foo(x) 
       // ^^^^^^ initializer list 
    {} 
}; 
6

Sí, se puede:

#include <iostream> 

using std::cout; 
using std::endl; 

class A{ 
public: 
    A(){ 
     cout << "parameterless" << endl; 
    } 

    A(const char *str){ 
     cout << "Parameter is " << str <<endl; 
    } 
}; 

class B{ 
    A _argless; 
    A _withArg; 

public: 
    // note that you need not call argument-less constructor explicitly. 
    B(): _withArg("42"){ 
    } 
}; 

int main(){ 
    B b; 

    return 0; 
} 

la salida es:

parameterless 
Parameter is 42 

View this on ideone.com

+0

Su comentario sobre constructores miembros de argumentos de menos no tener que ser llamado explícitamente es exactamente lo que estaba buscando. ¡Gracias! – Jaime

Cuestiones relacionadas