2012-04-21 94 views
6

這個簡單的例子說明了C++的語法來調用基類的構造函數 - 據我把它理解爲一個C++初學者:C++:調用基類的構造函數與計算參數

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

這裏,基類構造函數可以將派生類構造函數的命名參數作爲輸入。

現在,如果我想調用BaseClass()構造函數的輸入值不是直接輸入到DerivedClass()?基本上,我想做內DerivedClass()xy多一些工作,然後計算出的值傳遞給BaseClass()。這可以通過構造函數完成嗎?這應該用某種初始化方法來完成嗎?

回答

11

你能做到這一點,是:

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

需要注意的是,你甚至可以使一個compute()非靜態方法,但要知道,DerivedClassBaseClass成員不會在的時候被初始化呼叫。所以你不能依靠他們的價值觀。如果您使用C++ 11或更高版本

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 
} 
+0

@Seth卡內基:謝謝你的失蹤' ;'解決方案:我猜最近我一直在做太多的Python。 – ereOn 2012-04-21 16:33:48

2

然後你就可以做到這一點

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

你也可以使用lambda表達式:

+1

+1提示存在lambda。但是,如果計算量太大,它不會很好。它使閱讀構造函數(恕我直言)變得困難。 – Nawaz 2012-04-21 16:29:59

相關問題