2010-01-27 154 views
0

我很確定這個問題很小,但我不習慣C++。如何在.hpp/.cpp文件中定義/聲明類實例?

我有一個.hpp類定義和一個.cpp類實現。我有一些私人情況下的類,例如:

class Test 
{ 
    Test(void); 

    private: 
     SomeClass anInstance; 
}; 

創建實例,並在類的構造函數再次調用構造函數我必須定義呢?

Test::Test(void) 
{ 
    SomeClass anInstance(constructor parameters); 
} 

在此先感謝!

編輯:

嗯,對不起,但我不明白你在說什麼,所以讓我給你一個更好的例子:

class A 
{ 
    public: 
     A(int p1,int p2); 
} 

class B 
{ 
    public: 
     B(A *p1,int p2); 
} 

class C 
{ 
    public: 
     C(void); 
    private: 
     A instanceA; 
     B instanceB; 
} 

然後,在構造函數的實現類CI想創建instanceA並將其傳遞給instanceB的構造函數。希望澄清這個問題。

回答

4

沒有,你需要一個初始化列表:

Test::Test(void) : anInstance(parameters) 
{ 
} 

這將很好地工作的固定參數,如「foobar的」或42,但如果你需要傳遞變量參數,你也需要改變測試構造函數的定義(以及頭文件中的聲明)。例如,IIF需要一個int初始化實例,你需要:

Test::Test(int someval) : anInstance(someval) 
{ 
} 

編輯:爲你是問有關你修改的內容,你可能會更好動態創建的對象和使用指針。但是,你可以用值也做到這一點(使用結構,以儘量減少我的打字功夫):

struct C { 

    int a; 
    int b; 

    C() : a(1), b(a) { 
    } 
}; 

如果你這樣做,請注意,初始化順序是成員變量出現在類/結構的順序,而不是初始化列表中的順序。

+0

這一直是幫助我更多的答案。謝謝! – 2010-01-27 14:01:19

2

不,當您構建Class時,會員將自動初始化。默認的(零參數)構造函數將運行。

如果不存在這樣的構造函數,你需要做的顯式調用,從你的類的構造函數的initialization list

Class::Class() 
: anInstance(4711, "w00t!") 
{ 
} 

初始化列表是冒號和左括號之間的代碼;它是初始化實例成員的地方。此代碼在大括號內的代碼之前運行。

+0

好吧,我將檢查什麼是初始化列表意味着看看這是否給我一些亮點。謝謝。 – 2010-01-27 12:30:54

1

首先,您不需要Test的構造函數聲明中的void。

如果SomeClass的有一些參數傳遞,你可以通過他們這樣的:

Test::Test() : anInstance(params) 
{ 

} 
0

如果不穿上與SomeClass的對象東西,SomeClass的默認構造函數調用。如果你想用特定的參數調用它,你需要傳遞這樣的參數:

Test::Test(void) : anInstance(arg1, arg2, ..) {}