[英]How to call parameterized constructor of member object variable in a class' default constructor in C++?
我想在 class 的默認構造函數中初始化成員 object 變量。
讓我們考慮以下內容,
class ABC {
ABC(int A, int B) {
a = A;
b = B;
}
int a;
int b;
};
class Foo {
Foo();
ABC m_obj1;
};
從上面的例子中,我想在“Foo::Foo()”中初始化“obj1”。 我的限制之一是我不能在初始化列表中這樣做,因為我需要在初始化成員之前進行一些計算。 所以可用的選項(ASFAIK)是只在默認構造函數的主體中這樣做。
任何輸入,我該怎么做? 編輯:限制為 C++11
這會是一個正確的方法,
Foo:Foo() {
int x = 10;
int y = 100;
m_Obj1(x, y); //Is this correct? <--------
}
根據您的具體問題和要求,可能會提供多種解決方案:
選項 1:使用 function 進行計算並調用Foo
構造函數
Foo makeFoo()
{
// Computations here that initialize A and B for obj1 constructor
return Foo(A, B)
}
選項 2:調用 function 執行計算並在Foo
成員初始化程序列表中初始化obj1
ABC initABC() {
// Some computations
return ABC(A, B)
}
Foo() : obj1(initABC()) {}
選項 3:動態分配 obj1,例如使用std::unique_ptr
選項 4:使用std::optional
或模擬的 c++11 版本,如其他答案所示
您只需在派生構造函數的初始值設定項列表中調用基本構造函數。 初始化列表在構造函數參數之后以“:”開頭。 見示例代碼!
在初始化列表本身中調用函數沒有問題。
int CallFunc1(int x) { return x*2; }
int CallFunc2(int y) { return y*4; }
class ABC {
public:
ABC(int A, int B):a{CallFunc1(A)},b{CallFunc2(B)} {
std::cout << "Constructor with " << a << " " << b << " called" << std::endl;
}
private:
int a;
int b;
};
class Foo {
public:
Foo(): obj1(1,2){}
Foo( int a, int b): obj1(a, b){}
private:
ABC obj1;
};
int main()
{
Foo foo;
Foo fooo( 9,10);
}
編輯:
對於您的情況,我能想到的最佳方法是復制構造函數,更具體地說明您需要存儲的內容會很有幫助,因為如果它只是 class 動態分配中的兩個整數,那么 object 的大小是構造對哪種方法最好有影響,對於更大的數據類型,復制構造函數可能會更慢,因為 object 必須創建兩次:一次是在父對象構造函數中自動構造時,另一次是在創建臨時 object 時必須復制這些值,如果大小較大,這可能會比動態分配更慢。
據我所知,class 中的所有對象都會在構造函數中自動初始化/分配,因此可悲的是動態 memory 使用可能是您最好的選擇。
如果您對 object 初始化但為空感到滿意,那么您知道它還沒有“准備好”,但您可以稍后在您想要初始化它時用有用的數據填充它。 這可以通過將 object 中的內容設置為 null 值或類似值的默認構造函數來完成,因此您知道 object 尚未正確初始化。 然后在使用 object 之前,您可以通過檢查 null 值或通過在 object 中放置一個告訴您它是否已初始化的布爾值來檢查它是否已初始化。 在我看來,動態分配仍然會更好,並使代碼看起來更干凈,因為您需要存儲的只是 null 指針,直到需要 object 然后分配並設置為指針。 也很容易檢查指針是否等於 nullptr 以了解 object 的 state。
動態分配 memory 可能很麻煩,因為您必須確保擺脫 memory 泄漏,並且比使用堆棧稍慢,但是對於 Z6CE809EACF90BA125B40FA4BD90396堆棧上可用的幾兆字節數據,所以如果你這樣做只是為了避免麻煩,我建議正確學習它。 如果您能更具體地了解您想要使用哪種 object 或者您只是想要一個適用於大多數情況的答案,那就太好了。 例如:
*ABC obj1 = nullptr;
...object is needed
obj1 = new(ABC(constructor stuff));
...obj1 isn't needed
delete obj1;
或 c++ 在程序關閉時自動刪除它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.