#c
#c
Вопрос:
допустим, у меня есть 200 классов с именами class1, class2 и т.д., производных от class, и целое число от 1 до 200. Есть ли способ создать экземпляр конкретно одного из производных классов в зависимости от значения моего целого числа? Очевидно, я мог бы просто вручную проверить каждое значение, но мне интересно, есть ли в C что-нибудь более гибкое
Ответ №1:
Вам нужно будет переключить ваше целое число и создать экземпляр определенного класса. Если у вас есть this int
-> class
logic где-то еще в вашей программе, вы могли бы рассмотреть возможность представления его с помощью карты времени компиляции. Посмотрите на Boost.В частности, MPL boost::mpl::map
.
Ответ №2:
Это может быть просто более длинный способ делать то же самое, но у вас может быть фабричный метод для каждого производного класса, например…
std::auto_ptr<BaseClass> createClass0()
{
return std::auto_ptr<BaseClass>(new Class0());
}
Затем определите массив этих функций
typedef std::auto_ptr<BaseClass> (*pt2Creator)();
pt2Creator creators[] = {createClass0, ...};
Затем вы можете сделать
std::auto_ptr<BaseClass> createClass(int n)
{
return creators[n]();
}
Если вы пытались избавиться от необходимости писать код для каждого класса, это вам не поможет, но если проблема заключается в том, чтобы определить во время выполнения, какой класс создавать на основе целого числа, это поможет.
Вы также можете использовать стандартный тип коллекции, а не массив в стиле C.
Ответ №3:
Если вы ищете систему типа отражения, в которой вы можете видеть все классы, а затем создавать их динамически, нет. Вы можете использовать typeid для объектов среды выполнения, чтобы увидеть, совпадают ли они, но я считаю, что его поведение определяется реализацией.
Ответ №4:
Если вы можете создать шаблон своего класса, то есть назвать их
template <int I> class Foo;
вместо
class FooI
для выбора соответствующего класса можно использовать структуры данных во время компиляции или выполнения.
Комментарии:
1. Можно ли что-то сделать с новой строкой Foo<i>, когда это известно только во время выполнения?
2. Нет, но вы можете легко настроить рекурсию во время компиляции через i или справочную таблицу, чтобы выбрать правильный Foo .