C — создание экземпляра производного класса в зависимости от контекста

#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 .