2012-04-21 12 views
6

Questo semplice esempio dimostra la sintassi C++ per chiamare i costruttori della classe base - per quanto ho capito come C++ discente:C++: Chiamata di un costruttore della classe base con un argomento computerizzata

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; 
    } 

Qui, la classe di base il costruttore può prendere gli argomenti nominati al costruttore della classe derivata come input.

Ora, che cosa succede se si desidera chiamare il costruttore BaseClass() con un valore di input che non è un input diretto a DerivedClass()? Fondamentalmente, mi piacerebbe fare un lavoro su più righe con x e all'interno di DerivedClass(), quindi passare un valore calcolato a BaseClass(). Questo può essere fatto con i costruttori? Questo dovrebbe essere fatto con un qualche tipo di metodo di inizializzazione?

risposta

11

Si può fare, 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; 
}; 

Nota che si può anche fare compute() un metodo non statico, ma essere consapevoli che DerivedClass o BaseClass membri non verranno inizializzate al momento della chiamata. Quindi non sarai in grado di fare affidamento sui loro valori.

+0

@Seth Carnegie: Grazie per la mancanza ' ; 'fix: DI suppongo di aver fatto troppo Python ultimamente. – ereOn

2

Poi si può fare questo:

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

Se stai usando C++ 11 o più recente è anche possibile utilizzare le espressioni 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 per ricordare che esiste lambda. Ma non andrà bene se il calcolo è troppo grande. Rende difficile leggere il costruttore (IMHO). – Nawaz

Problemi correlati