2011-03-31 90 views
2

我不習慣C++,而且在寫一個構造函數時遇到了問題。
看到這個例子,是我工作的代碼的短版:C++如何寫一個構造函數?

class B { 
public: 
    B(int x); 
} 

class A { 
public: 
    B b; 
    A(){ 
    // here I have to initialize b 
    } 
} 

,因爲我需要在構造函數初始化B,因爲B沒有默認的構造函數拋出一個編譯器錯誤。我想我已經在初始化列表中做了它,但B(int x)參數是一個值,我必須用一些算法來計算,所以我不知道這應該如何正確完成,或者如果我錯過了某些東西或做錯了。

在像java這樣的其他語言中,我會有一個對B的引用,並在我需要獲取初始化值的其他代碼之後,將它初始化爲A的構造函數。

在這種情況下,初始化b的正確方法是什麼?

謝謝!

回答

11

您可以調用函數在構造函數初始化列表

class B { 
public: 
    B(int x); 
}; // note semicolon 

class A { 
public: 
    B b; 

    A() 
    :b(calculateValue()) { 
    // here I have to initialize b 
    } 

    static int calculateValue() { 
    /* ... */ 
    } 
}; // note semicolon 

注意,在初始化列表中,則該類被視爲完全定義,所以你可以看到聲明以後太成員。最好不要在構造函數初始化列表中使用非靜態函數,因爲並不是所有成員都在那個時候初始化。靜態成員函數調用很好。

+0

謝謝,這工作。艱難的我認爲可能有更好的/更清潔的方式。 – Damian 2011-04-01 00:06:34

+0

還要確保在成員初始值設定項列表中使用的函數不會拋出任何異常。 :) – Viren 2011-04-01 00:20:26

+0

雖然這個作品...它必須是那麼可怕?這使得我所有的相關代碼都在文件周圍混合了。一邊的對象構造,另一邊的對象配置等等......也許最好有一個默認的構造函數來創建一個不工作的實例,然後在構造函數中創建一個新的實例。你怎麼看? – Damian 2011-04-01 03:01:00

1

您使用初始化列表,像這樣:

A() : b(f(x)) {} 
-1
#include<iostream> 

class B { 
    public: 
     B(){} // A default constructor is a must, if you have other variations of constructor 
     B(int x){} 
}; // class body ends with a semicolon 

class A { 
    private: 
     B b; 
    public: 
     A(){ 
      // here I have to initialize b 
     } 
     void write(){ 
      std::cout<<"Awesome"; 
     } 
}; 

int main(){ 
    A a; 
    a.write(); 
} 

在C++中,如果你有一個構造函數的參數,默認構造函數是必須的,不像其他語言如Java。這就是你需要改變的一切。謝謝。

+1

-1:否,不需要默認ctor。 +1表示需要分號。仍然在零... – 2011-03-31 23:33:11

相關問題