我有一個字符串變量var = "BaseClass"
,那麼我必須用它的內容函數替換那個var,例如我打電話"BaseClass"
這樣的功能BaseClass::func_name();
現在我的問題是,如果我不得不從名稱存儲到var
字符串,即var::func_name()
的類中調用函數,我們可以用它的內容替換var變量,並調用正確的類函數。如何用其內容替換字符串變量?
在此先感謝。
我有一個字符串變量var = "BaseClass"
,那麼我必須用它的內容函數替換那個var,例如我打電話"BaseClass"
這樣的功能BaseClass::func_name();
現在我的問題是,如果我不得不從名稱存儲到var
字符串,即var::func_name()
的類中調用函數,我們可以用它的內容替換var變量,並調用正確的類函數。如何用其內容替換字符串變量?
在此先感謝。
簡單的答案:
在C++中,NO,你不能沒有使用一些第三方庫或框架做到這一點。
這是不可能的通用的方式。類的名稱通常不會將其放入可執行文件中。相反,請使用函數指針(用於靜態成員函數)或成員指針(用於非靜態成員函數)。
不,編譯器不會讓它工作,因爲在考慮到變量的插值後它將無法進行類型推斷,它靜態地需要能夠確定方法的類型被調用以生成適當的機器碼。
不確定這是你在做什麼之後,但是你可以保存一個名字作爲鍵的映射和指向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();
您不能在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();
}
你能澄清你的問題嗎?我不明白你在問什麼。 – templatetypedef 2011-03-09 09:26:43
[C++中的動態源代碼]的可能的重複(http://stackoverflow.com/questions/895077/dynamic-source-code-in-c) – Aamir 2011-03-09 09:32:26
@templatetypedef問題是關於內省,通常只有在更高級別Java,Perl,Python等語言 – 2011-03-09 09:33:17