簡體   English   中英

在構造函數中創建對象

[英]Object creation in constructor

我以某種方式讀到在構造函數中創建對象是一種不好的風格……但是,我忘記了為什么它被認為是不好的風格(尤其是在使用依賴注入時)。

這是一個在構造函數中創建對象的示例,該示例為偽代碼:

Myclass
{
    Myclass(MyMemberFactory& fac)
    {
        for(Some criteria)
            push_back(fac.createMyMemberType());
    }

    vector<MyMemberType*> getMyMember();
    {
        return myMember_;
    }
    ...

private:
    vector<MyMemberType*> myMember_;
}

因此,您可以毫無問題地使用單元測試,因為您可以模擬MyMemberFactory。 如果我將for循環移動到單獨的初始化方法中,則必須檢查雙重初始化,並且如果已經完成初始化,則所有吸氣劑都需要首先進行修正。 下面的代碼通過使用單獨的初始化:

Myclass
{
    Myclass() : isInitialized_(false)
    {

    }

    void initialize(MyMemberFactory& fac);
    {
        if(isInitialized_)
            throw "Error: Double-Init is not permitted.";

        for(Some criteria)
            push_back(fac.createMyMemberType());

        isInitialized_ =true;
    }

    vector<MyMemberType*> getMyMember();
    {
        if(isInitialized_)
            throw "Initialize first!";

        return myMember_;
    }
    ...

private:
    vector<MyMemberType*> myMember_;
    bool isInitialized_;
}

那么,您是否知道任何原因,為什么我應該使用第二種方法而不是第一種方法? 或者,也許我只是記錯了,第一種方法完全可以嗎?

如果構造函數引發異常,則不會調用析構函數,因此您將丟失所有手動分配的內存。

第一種方法實際上很好。 它不是在一個構造對象的創建是有問題的,它是一個構造函數這樣做是有問題的。 所以

Myclass()
{
    MyMemberFactory fac;
    for(Some criteria)
        push_back(fac.createMyMemberType());
}

由於客戶不能再使用其他工廠(例如,用於測試),因此會出現問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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