2011-01-27 156 views
1

我有一個包含類名的字符串。 我想創建該類的實例..創建實例

class Test 
{} 

在主要功能

String str="Test"; 

我要創建只使用str變量的測試類的實例...

+3

使用C++,Java還是什麼? – peoro 2011-01-27 13:26:18

回答

3

您必須使用稱爲反射的技術。這裏是Wikipedia article on Reflection (computer programming)

對於Java:看看Class class,特別是Class.newInstance method

下面是一個簡單的 「Hello World」 程序來演示:

public class Test { 

    public static void main(String[] args) throws Exception { 
     String className = "Test"; 

     Class c = Class.forName(className); 
     Object o = c.newInstance(); 

     ((Test) o).method(); 
    } 

    public void method() { 
     System.out.println("Hello World"); 
    } 
} 
0

嘗試

Object obj = Class.forName(str).newInstance(); 
0
Test t = (Test) Class.forName(className).newInstance() 
1

你不能做到這一點用C本身 ++。將需要通過使用某些結構(可能會查找表)來模擬反射,這些結構會將字符串與類型相關聯,這將爲您創建對象。

1
Class.forName(str).newInstance(); 

上面的代碼返回該類的一個對象。確保'str'具有完全限定的類名稱。

2

使用Java,你需要使用Reflection API

String className = "Test"; 
Test newInst = (Test)Class.forName(className).newInstance(); 

C++卻毫無反思等同於Java,所以你需要自己實現:

void* newInstance(std::string className) { 
    if (className == "Test") { 
     return new Test(); 
    } 

    return 0; 
} 
1

在Java中,你有支持默認情況下的反射。在本機C++中,你沒有反思。如果您需要C++的反思,請嘗試使用像Qt這樣的框架。

0

您試圖描述的通用OOP技術稱爲抽象工廠模式,您可以在其中讀取數據,然後在運行時決定要創建的類的類型。

通常這個類將從一個已知的基礎派生,否則它將不得不是某種變體類型。

對於派生自已知基的類,您將繼續調用其虛擬/抽象方法(多態性)。對於變體類型,您可能會「訪問」它。