2011-01-27 144 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技术称为抽象工厂模式,您可以在其中读取数据,然后在运行时决定要创建的类的类型。

通常这个类将从一个已知的基础派生,否则它将不得不是某种变体类型。

对于派生自已知基的类,您将继续调用其虚拟/抽象方法(多态性)。对于变体类型,您可能会“访问”它。