2012-04-21 18 views
6

Este simple ejemplo muestra la sintaxis de C++ para llamar constructores de clase de base - por lo que yo entiendo como C++ alumno:C++: Llamar a un constructor de la clase base con un argumento computarizada

class BaseClass { 
protected: 
    int i; 
public: 
    BaseClass(int x) { 
    i = x; 
    } 
}; 

class DerivedClass: public BaseClass { 
    int j; 
public: 
    DerivedClass(int x, int y): BaseClass(y) { 
    j = x; 
    } 

Aquí, la clase base constructor puede tomar argumentos con nombre para el constructor de clase derivado como entrada.

Ahora, ¿y si quiero llamar al constructor BaseClass() con un valor de entrada que no es una entrada directa al DerivedClass()? Básicamente, me gustaría hacer algunos trabajos de línea múltiple con x y y dentro de DerivedClass(), luego pasar un valor calculado a BaseClass(). ¿Se puede hacer esto con los constructores? ¿Debería hacerse esto con algún tipo de método de inicialización?

Respuesta

11

Usted puede hacer eso, sí:

class BaseClass 
{ 
    public: 
    BaseClass(int x) : i(x) {} 

    private: 
    int i; 
}; 

class DerivedClass: public BaseClass 
{ 
    public: 
    DerivedClass(int x, int y): 
     BaseClass(compute(x, y)), // Neither i or j are initialized here yet 
     j(x) 
     {} 

    private: 
    static int compute(int a, int b) { return a + b; } // Or whatever 
    int j; 
}; 

Tenga en cuenta que incluso se puede hacer compute() un método no estático, sino tener en cuenta que DerivedClass o BaseClass miembros no serán inicializadas en el momento de la llamada. Por lo tanto, no podrá confiar en sus valores.

+0

@Seth Carnegie: Gracias por la falta ' ; 'corregir: supongo que he estado haciendo demasiado Python últimamente. – ereOn

2

A continuación, puede hacer esto:

DerivedClass(int x, int y): BaseClass(compute(x,y)), j(y) { 
    //j = x; //use member-initialization-list ---> ^^^^ 
    } 

int compute(int x, int y) 
{ 
    //your code 
} 
3

Si estás usando C++ 11 o más reciente también puede utilizar expresiones lambda:

class BaseClass 
{ 
    public: 
    BaseClass(int x) : i(x) {} 

    private: 
    int i; 
}; 

class DerivedClass: public BaseClass 
{ 
    public: 
     DerivedClass(int x, int y): BaseClass(
      [=]()->int 
      { 
       int sum = 0; 
       for(int i = 0; i < x; ++i) 
       { 
        sum += y + i * x; 
       } 
       return sum; 
      }()), j(x) 
     {} 

    private: 
    int j; 
}; 
+1

+1 para el recordatorio de que existe lambda. Pero no será bueno si el cálculo es demasiado grande. Hace difícil leer el constructor (en mi humilde opinión). – Nawaz

Cuestiones relacionadas