2012-03-02 124 views
5

可能這很容易,但有人可以告訴我如何使用在子類的構造函數中計算的參數來調用超類的構造函數嗎?是這樣的:C++調用具有計算參數的超類構造函數

class A{ 
    A(int i, int j); 
}; 

class B : A{ 
    B(int i); 
}; 

B::B(int i){ 
    int complex_calculation_a= i*5; 
    int complex_calculation_b= i+complex_calculation_a; 
    A(complex_calculation_a, complex_calculation_b); 
} 

//編輯:我編輯的例子,這樣的超取其中只有這樣的關係彼此

回答

4

如果你不能表達單行表達你的計算,添加靜態函數,並調用它的方式,你通常調用父類的構造函數:

class B : A{ 
public: 
    B(int i) : A(calc(i)) {}; 
private: 
    static int calc(int i) { 
     int res = 1; 
     while (i) { 
      res *= i--; 
     } 
     return res; 
    } 
}; 

EDIT多參數的情況下:

class B : A{ 
public: 
    B(int i) : A(calc_a(i), calc_b(i)) {}; 
private: 
    static int calc_a(int i) { 
     int res = 1; 
     while (i) { 
      res *= i--; 
     } 
     return res; 
    } 
    static int calc_b(int i) { 
     int complex_a = calc_a(i); 
     return complex_a+10; 
    } 
}; 
+0

好嗎 - 如果超類的構造函數有幾個參數? – Mat 2012-03-02 20:01:28

+0

@Mat您需要定義單獨的函數來計算每個參數的值,您不能或不想將它們「內聯」爲表達式。 – dasblinkenlight 2012-03-02 20:03:26

+0

但計算的參數可能相互依賴 - 我如何解決不同的功能? – Mat 2012-03-02 20:06:34

1

兩個參數:

class A{ 
    A(int i); 
}; 

class B : A{ 
    B(int i); 
}; 

B::B(int i) : A(i*5) { 
} 

通話到父類的構造函數只能進入初始化列表。這意味着,無論你計算必須已知以前 B被完全構造(即:你不能叫一個B成員函數,除非其static,但只依靠傳遞給B參數)

+0

好 - 在這種情況下,我的例子是壞的。我需要做幾個函數調用,循環,條件分支等來計算參數 – Mat 2012-03-02 20:00:17

+0

@Mat - 正如我所說 - 你只能在外部函數(全局或靜態類成員,或一個成員函數傳遞給'B'的對象)。當'A'被調用時'B'不存在。 – littleadv 2012-03-02 20:02:37

3
B::B(int i) 
    : A(i * 5) 
{} 

用C++ 11,一個更復雜的方法是

B::B(int i) 
    : A(([](int x) { return 5 * x; })(i)) 
{} 

對於複雜的情況下,被保護的函數init是更具有可讀性。

1
struct A 
{ 
    A(int); 
}; 

struct B : public A 
{ 
    B() 
     : A(5) // "initialisation list" 
    {} 
}; 

你要做這個名單裏面,但你可以使用的功能。 編輯:如果您使用的功能,你可能想使它B.

的私有靜態成員
0
class A 
{ 
public: 
    A(int i){} 
}; 


class B : public A 
{ 
public: 
    B(int i):A(i*5){} 
}; 
相關問題