2016-02-26 38 views
1

我想在我的Base類中包含一個Composed對象,並且有不同的派生類具有不同的配置。但Composed類需要構造函數中的參數,並且我無法控制其體系結構。如何初始化派生類中需要構造函數參數的成員對象?

編譯器報告錯誤,因爲Composed的參數應該在Base類的初始化時傳遞。但我只希望它在派生類中初始化。在這種情況下我該怎麼辦?

class Base{ 
    public: 
    Base(); //Error 
    protected: 
    Composed comp; 
}; 
class Composed{ 
    public: 
    Composed(int id):id(id); 
    private: 
    int id; 
}; 
class Derived_1:public Base{ 
    public: 
    Derived():comp(1234){}; 
};  
class Derived_2:public Base{ 
    public: 
    Derived():comp(2345){}; 
}; 
+1

應該'Base'甚至有一個構造函數嗎?它可以做成純粹的虛擬?如果它有一個'Composed'成員但沒有初始化它,有沒有使用'Base'對象? – Biffen

+0

很有道理!你能給出一個代碼示例嗎? –

+0

什麼?一個不存在的構造函數? – Biffen

回答

4

你必須傳遞參數高達基地,然後把它降到比較:

class Composed{ 
    public: 
    Composed(int id):id(id); 
    private: 
    int id; 
}; 
class Base{ 
    public: 
    Base(int id):comp(id){} 
    protected: 
    Composed comp; 
}; 
class Derived_1:public Base{ 
    public: 
    Derived():Base(1234){}; 
};  
class Derived_2:public Base{ 
    public: 
    Derived():Base(2345){}; 
}; 
+0

傻我!忘記了所有的基礎知識。謝謝! :) –

1

有幾個選項。最直接的方法是將構建Comp所需的對象傳遞給Base類構造函數。

class Base{ 
    public: 
    Base(int id):comp(id){} 
protected: 
    Composed comp; 
}; 

class Derived_1:public Base{ 
    public: 
    Derived():Base(1234){} 
};  
class Derived_2:public Base{ 
    public: 
    Derived():Base(2345){} 
}; 

另一種可能性是不在基類中包含Comp。把它放在每個派生類中。您可以將純虛函數添加到返回Comp(或其地址)的Base類。

另一個選擇是存儲指向Comp(也許是unique_ptr)的指針並將其分配到派生類中。

2

想象一下,您構建了一個Base對象。它如何知道要傳遞給comp的構造函數的參數? Base類基本上有缺陷,這就是爲什麼你有錯誤。它需要知道如何構造它的Composed成員對象。

您可以爲Composed添加默認構造函數,然後在Derived_1Derived_2中修改此對象。或者,如其他人所建議的,您可以使Base的構造函數採用參數構造comp。這聽起來比我更喜歡,但這取決於你的用例。

請記住,當您構建Derived_1Derived_2時,Base類是在其他成員變量之前創建的第一個東西。

相關問題