Введение
В объектно-ориентированном программировании создание экземпляров является обычной практикой объекты из определенных классов. Однако в некоторых сценариях может быть выгодно динамически создавать объекты на основе имен классов, хранящихся в виде строк. Это может обеспечить повышенную гибкость и удобство сопровождения кода. В этой статье исследуются возможности создания динамического объекта в C.
Создание экземпляра динамического объекта с использованием преобразования строки в тип
К сожалению, C изначально не предоставляет прямой механизм преобразования строк, содержащих имена классов, в фактическую информацию о типе. Это означает, что статически определенные классы не могут быть динамически созданы без явных изменений кода.
Альтернативные подходы
Хотя прямое преобразование строки в тип недоступно, существуют альтернативные методы создания динамических объектов:
1. Использование структуры сопоставления:
Вы можете создать сопоставление между именами классов (в виде строк) и указателями функций, которые создают экземпляры этих классов. Это позволяет создавать динамические объекты путем поиска указателя функции и ее вызова.
templateBase* createInstance() { return new T; } std::map<:string base> map; map["DerivedA"] = &createInstance ; // ... and so on
2. Автоматическая регистрация классов:
Этот метод предполагает регистрацию классов во время компиляции с использованием макросов или шаблонов. Зарегистрированные классы автоматически добавляются на глобальную карту, что позволяет создавать объекты из любого зарегистрированного класса, используя его имя.
#define REGISTER_DEC_TYPE(NAME) \ static DerivedRegisterreg #define REGISTER_DEF_TYPE(NAME) \ DerivedRegister NAME::reg(#NAME) class DerivedB { ...; REGISTER_DEF_TYPE(DerivedB); };
3. Использование варианта Boost:
Для сценариев, в которых необходимо создавать объекты несвязанных типов, библиотека Boost предоставляет тип Variant
typedef boost::variantvariant_type; template variant_type createInstance() { return variant_type(T()); }
Заключение
Хотя в C отсутствует прямое преобразование строк в типы, альтернативные подходы, обсуждаемые в этой статье, предоставляют средства для динамического создания экземпляров объектов из строк. Используя структуры сопоставления, автоматическую регистрацию классов или тип варианта Boost, разработчики могут добиться большей гибкости и удобства сопровождения кода в своих объектно-ориентированных приложениях.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3