2011-01-27 7 views
1

私はクラス名を含む文字列を持っています。主な機能でインスタンスを作成する

class Test 
{} 

すなわち 私はそのクラスのインスタンスを作成したい。..

String str="Test"; 

私は唯一のstr変数を使用してテストクラスのインスタンスを作成する必要があります...

+3

C++、Javaなどを使用していますか? – peoro

+3

@peoro、 'oop';を使って) –

答えて

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

は、あなたがそれをネイティブ C++での操作を行うことはできません

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

を試してみてください。文字列を型に関連付けるいくつかの構造体(ルックアップテーブルかもしれない)を使用してリフレクションをシミュレートする必要があります。これにより、オブジェクトが作成されます。

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

上記のコードは、クラスのオブジェクトを返します。 'str'が完全修飾クラス名を持っていることを確認してください。 Javaでは

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

    return 0; 
} 
2

デフォルトで反映されます。ネイティブC++では、リフレクションはありません。 C++でリフレクションが必要な場合は、Qtのようなフレームワークを使用してみてください。

1

あなたがのためのサポートを持っている:C++は、Javaと同等のネイティブリフレクションを持っていないので、あなたはそれを自分で実装する必要が

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

:あなたはReflection APIを使用する必要があるのJavaと

0

説明しようとしている一般的なOOPテクニックは抽象ファクトリパターンと呼ばれ、データを読み込んで実行時にどのタイプのクラスを作成するかを決定します。

通常、クラスは既知のベースから派生します。そうでなければ、ある種のバリアント型でなければなりません。

既知の基底から派生したクラスでは、仮想/抽象メソッド(多態性)を呼び出すことになります。バリアント型の場合は、おそらく "訪問する"でしょう。

関連する問題