2011-03-09 47 views
1

我有一個字符串變量var = "BaseClass",那麼我必須用它的內容函數替換那個var,例如我打電話"BaseClass"這樣的功能BaseClass::func_name(); 現在我的問題是,如果我不得不從名稱存儲到var字符串,即var::func_name()的類中調用函數,我們可以用它的內容替換var變量,並調用正確的類函數。如何用其內容替換字符串變量?

在此先感謝。

+0

你能澄清你的問題嗎?我不明白你在問什麼。 – templatetypedef 2011-03-09 09:26:43

+0

[C++中的動態源代碼]的可能的重複(http://stackoverflow.com/questions/895077/dynamic-source-code-in-c) – Aamir 2011-03-09 09:32:26

+0

@templatetypedef問題是關於內省,通常只有在更高級別Java,Perl,Python等語言 – 2011-03-09 09:33:17

回答

0

簡單的答案:

在C++中,NO,你不能沒有使用一些第三方庫或框架做到這一點。

0

這是不可能的通用的方式。類的名稱通常不會將其放入可執行文件中。相反,請使用函數指針(用於靜態成員函數)或成員指針(用於非靜態成員函數)。

0

不,編譯器不會讓它工作,因爲在考慮到變量的插值後它將無法進行類型推斷,它靜態地需要能夠確定方法的類型被調用以生成適當的機器碼。

1

不確定這是你在做什麼之後,但是你可以保存一個名字作爲鍵的映射和指向BaseClass派生對象的指針作爲值。錯誤檢查省略。

typedef std::map< std::string, BaseClass* > myMap; 

class A : public BaseClass 
{ 
    void func(); 
} 

class B : public BaseClass 
{ 
    void func(); 
} 

myMap m; 
A a; 
B b; 
m[ "A" ] = &a; 
m[ "B" ] = &b; 

std::string varName = GetVarNameFromSomeWhere(); 
m[ varName ]->func(); 
0

您不能在C++中動態定義新類型,但您可能可以使用其他語言(objective-C?)。首先,檢查你是否真的需要這個。

如果你有一組有限的,你想,即1類,類2,ClassN玩的變量類型,你總是可以這樣做:

string var; 
Class1 class1; 
ClassN classN; 
readFromSomewhere(var); 
if (var == "Class1") 
{ 
    class1.func_name(); 
} 

或者,它可能是你真正需要的是某種類型的遺傳和多態性代碼:

string var; 
Base* p1 = new Class1(); 
Base* pN = new ClassN(); 
if (var == "Class1") 
{ 
    p1->func_name(); 
}