2012-08-28 52 views
1

可能重複:
minimal reflection in C++當類名稱存儲在另一個變量如何創建一個類的實例

基本上我都存儲在char *類的名稱,如何創建該類的實例。 以下是我的想法。它的作品,當我通過Test作爲模板參數是好的,但如果我嘗試這樣的事情Test *t = CreateType<ptr>它不會工作。

有什麼辦法可以使這項工作。

class Test{ 
public: 
    Test() { 
    } 
    ~Test() { 
    } 
}; 

template <typename T> 
T* CreateType() { 
    return new T; 
} 

int main (int argc, char **argv) { 
    char *ptr = "Test"; 
    Test *T = CreateType<Test>(); 
    return 0; 
} 
+0

C++根本不允許這樣做。 –

+0

您必須編寫一個工廠類,它可以爲您創建所需的對象。 – tuxtimo

回答

4

這是不可能在C++中,由於像在C++反射的機制。你可以做的是寫一個工廠,知道如何從一個字符串構造一個對象。

class Base 
{ 
public: 
    virtual ~Base(){} 
}; 

class Factory 
{ 
public: 
    typedef std::function<Base*()> Creator; 

    void Register(const std::string& key, Creator creator) 
    { 
     creators_[key] = creator; 
    } 

    std::unique_ptr<Base> Create(const std::string& key) 
    { 
     auto creator = creators_[key]; 
     auto instance = std::unique_ptr<Base>(creator()); 
     return instance; 
    } 

private: 
    std::unordered_map<std::string, Creator> creators_; 
}; 


class Concrete : public Base 
{ 

}; 


int main() 
{ 
    Factory factory; 
    factory.Register("Concrete", [](){ return new Concrete;}); 

    auto instance = factory.Create("Concrete"); 

} 
5

它不是直接可能在C++中,這是因爲語言不是內省。

你可以嘗試做東西雖然相似。例如,您可以有一個map< string, baseClassPointer >,其中鍵是類的名稱,並且該值將是該類的對象的指針。然後,您可以通過從地圖複製對象(您可以通過類型名稱獲取)來創建其他對象。我不會建議這樣做。

工廠模式可能適合您的需求。

相關問題