2011-10-18 21 views
0

說我有創建的類的新對象,並將其放在一個數據結構(在這種情況下,地圖)的成員函數創建對象:基於函數Arguement C++

Class A 
{ 
    std::map<std::pair<int,int>, BaseClass*> store; 
    //... 
    public: 
    void createObject(?a?) 
    { 
     BaseClass* temp = new ?a?; 
     //place in map... 
    }; 
}; 

?a?是一個參數,可用於創建一個對象,該對象可以是衍生自BaseClass的多個不同類。我能想到的唯一方法是讓?a?int,並手動在switch語句中輸入每種類型。

+0

什麼是您的實際問題?如何知道哪個派生類型實例化,或如何知道哪些參數傳遞給構造函數,或..? – ildjarn

+0

如何知道實例化哪種類型。 –

回答

3

使用成員函數模板。在您的例子的情況下:

template<class T> 
void createObject() 
{ 
    BaseClass* temp = new T(); 
    //place in map... 
}; 

調用與:

a.createObject<B>(); 

aA一個實例,BBaseClass派生的類型。

0

取決於您如何知道要創建什麼樣的對象。

如果基於一個int(例如某個函數的返回代碼)是合理的,那麼switch語句就沒有問題。請注意,您需要通過調用new來創建每個對象,然後將對象指針轉換爲BaseClass以放入地圖。

如果您正在傳入此類型的對象,請使用模板。編輯:爲喬恩的答案

0

你應該可以創建並通過一個CreateObject函數可能的類的枚舉,例如:

enum FRUIT_CLASS { APPLE, ORANGE, BANANA }; 
... 
void A::createObject(FRUIT_CLASS) 
{ 
    switch(FRUIT_CLASS) 
    // etc 
} 

這樣,你實際上是通過一個整數作爲參數,但您的代碼更易於理解,可修改和可維護。

2

模板是比枚舉更好的解決方案,因爲它不需要任何維護。任何新的子類都將被自動支持。指針類型之間的類型安全保證T是temp的子類(否則分配將失敗)。

Class A 
{ 
    std::map<std::pair<int,int>, BaseClass*> store; 
    //... 
    public: 
    template <typename T> 
    void createObject() 
    { 
     BaseClass* temp = new T(); 
     //place in map... 
    }; 
}; 

如果沒有依賴參數,編譯器無法自動推導出模板類型,因此您需要對其進行限定。

Class Foo : public BaseClass { ... }; 

A a; 
a.createObject<Foo>(); 
+1

它不是不能推斷出它,它沒有信息來推斷它。 – Dani

+0

@Dani:稍微澄清我的發言。如果你有建議的措辭,我會用它來代替。 –