2011-01-27 2 views
1

У меня есть строка, содержащая имя класса. я хочу, чтобы создать экземпляр для этого класса ..create instance

т.е.

class Test 
{} 

в основной функции

String str="Test"; 

я должен создать экземпляр класса Test с использованием только переменной ул ...

+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

попробовать

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++ не имеет встроенной Reflection эквивалентную Java, так что вы должны реализовать его самостоятельно:

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

    return 0; 
} 
1

В Java у вас есть поддержка отражения по умолчанию. В родном C++ у вас нет отражений. Если вам нужны отражения на C++, попробуйте использовать такие фреймворки, как Qt.

0

Общая техника ООП, которую вы пытаетесь описать, называется шаблоном абстрактного завода, в котором вы читаете данные, а затем решаете во время выполнения тип создаваемого класса.

Обычно класс будет происходить от известной базы, иначе он должен быть своего рода вариантом.

Для класса, который происходит из известной базы, вы затем можете вызвать его виртуальные/абстрактные методы (полиморфизм). С вариантом типа вы, вероятно, «посетите» его.

Смежные вопросы