簡體   English   中英

如何在 C++ 的類的默認構造函數中調用成員 object 變量的參數化構造函數?

[英]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 時必須復制這些值,如果大小較大,這可能會比動態分配更慢。

  1. 據我所知,class 中的所有對象都會在構造函數中自動初始化/分配,因此可悲的是動態 memory 使用可能是您最好的選擇。

  2. 如果您對 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM