2012-09-24 68 views
0

如何根據字符串定義變量。我定義了許多類。但是我想根據一些字符串創建這個類的變量。根據字符串定義變量

代碼如下所示。

class AA {}; 
class BB {}; 
class CC { 
    CC(void *pt); 
    virtual ~CC(); 
}; 
...... 

void test(char *ss,void *pt=NULL) { 
    //??????How to do? 

} 

int main() { 
    a1=test("AA"); //a1=new AA(); 
    a2=test("AA"); //a2=new AA(); 
    b1=test("BB"); //b1=new BB(); 
    c1=test("CC",pt); //c1=new CC(pt); 
} 

Orther,你可以認爲這是URL和處理function.The的std ::地圖是常見的方法根據string.But無法創建新實例變量獲得類的實例。我希望根據字符串得到一個新的實例。

+2

幸運的是,你不能在C++中做這樣的事情。這不是PHP,也不鼓勵壞事。 – ThiefMaster

回答

5

C++是一種強類型語言,所以這是不可能的,因爲您現在擁有它。

最好的情況下,你會使用一個公共基類爲AABBCC然後用factory。你不能只寫:

a1=test("AA"); //a1=new AA(); 
a2=test("AA"); //a2=new AA(); 
b1=test("BB"); //b2=new BB(); 
c1=test("CC",pt); //b2=new CC(pt); 

沒有定義變量的類型。

例如:

class Base{}; 
class AA : public Base {}; 
class BB : public Base {}; 

Base* create(const std::string& what) 
{ 
    if (what == "AA") 
     return new AA; 
    if (what == "BB") 
     return new BB; 
    return NULL; 
} 

int main() 
{ 
    Base* a; 
    a = create("AA"); 
} 

Alternitively,你應該使用智能指針。如果你不這樣做,你必須自己管理記憶。

+2

's/strong/statically/g'。 http://stackoverflow.com/a/9929697/395760 – delnan

+0

這個類就像AA,BB不知道的。我希望封裝「創建」的功能。下面的人會做類似AA,BB的。我只寫基類並創建功能。 – simon

+1

@ user1641913好的...什麼? –

1

你可能希望你的函數返回一些東西,或者是void*或者最好是一個指向公共基地的[智能]指針。該字符串應該可以作爲char const*std::string const&傳遞。在該函數中,您可以直接比較參數,並調用適當的分配,或者創建一個std::map<std::string, FactoryFunction>以根據字符串查找工廠函數。

+0

std :: map不幫助定義變量....這是常用的方法根據字符串獲取類的實例...但不能創建一個新的實例給變量。 – simon

+0

再次閱讀我的答案:地圖將保存從字符串到工廠函數的映射。你可以調用找到的函數來創建你的實例(假設找到了一​​個;如果沒有找到,你就是信號錯誤,例如拋出異常)。 –

+0

你是對的,但我必須爲每個班級編寫功能。也許唯一的方法! – simon

0

可能不是使用字符串名稱的類型 - 按原樣使用類型。要做到這一點 - 使用模板。

class AA {}; 
class BB {}; 
class CC { 
public: 
    CC(void *pt) {} 
    virtual ~CC() {} 
}; 

template <class T>  
T* test() { 
    return new T(); 

} 
template <class T>  
T* test(void *pt) { 
    return new T(pt); 

} 

int main() { 
    void* pt; 
    AA* a1=test<AA>(); //a1=new AA(); 
    AA* a2=test<AA>(); //a2=new AA(); 
    BB* b1=test<BB>(); //b1=new BB(); 
    CC* c1=test<CC>(pt); //c1=new CC(pt); 
}