假設我定義了一個類Foo
,它沒有實現默認的構造函數。 另外,我有一個類Bar
,它「擁有」的Foo
一個實例:如何正確初始化非默認構造類成員?
class Foo() {
private:
int m_member;
public:
Foo(int value) : m_member(value) { }
};
class Bar() {
private:
Foo m_foo;
public:
Bar(/* ... */) {
int something;
/* lots of code to determine 'something' */
/* should initialize m_foo to 'Foo(something)' here */
}
};
如圖所示將不會運行的代碼,因爲Bar
試圖調用的Foo
默認構造函數。
現在我想要做的是讓Bar
的構造函數首先確定something
,然後將結果傳遞給Foo
的構造函數。
解決此問題的一種方法是讓Bar
僅擁有指向Foo
的引用/指針,並在確定m_something
後對其進行初始化。但是,我想避免這樣做,以明確m_foo
的使用期限完全取決於擁有班級的生命週期。
另一種方法是在Foo
中實現默認構造函數,並稍後設置值,這也是我也想避免的,因爲Foo
的任何實例都應該具有有效的成員值(任何時候)。
實現此目的的正確方法是什麼?我堅持在這裏參考/指針?
感謝您的回答。我也考慮過這樣做,但是在這種情況下,我必須將'Bar'的大部分初始化操作移到幫助函數中,因爲'something'依賴於此。 – madmax1
@ madmax1不好。然後,只需要獨立計算一些東西,或者使用你的一個想法(指針或默認的可構造的'Foo')。 – ForEveR