2009-08-17 2 views
1

Я получил небольшую проблему, которая разрешила в свободное время в отношении изменения поведения объектов, а также поведения класса во время выполнения на C++. Я немного прочитал и нашел эту ссылку, очень полезную для меня. http://www.vollmann.ch/en/pubs/meta/meta/meta.html Г-н Волманн сделал протокол метаобъектов (MOP) для определения классов во время выполнения, точнее их свойств.Метаклассы и размышления в C++

Я попытался добавить методы в одном и том же материале во время выполнения с динамической загрузкой DLL, но объекты не знали о своих новых добавленных поведениях. Я сохранил информацию о методах в DLL в xml-файлах, и когда я захотел добавить новое поведение в класс/объект, я проанализировал файлы xml и загрузил только нужную мне DLL, но это было недостаточно гибким.

Это всего лишь учебный случай, поэтому, если у вас есть какие-либо рекомендации, пожалуйста, сделайте это. У меня нет большого опыта работы на C++, но мне понравился вызов.

Заранее спасибо.

+0

Вы рассматривали функциональные указатели как возможное решение? – suszterpatt

ответ

5

Вы можете попытаться создать какой-то базовый класс для всех ваших классов. Этот класс имеет какой-то метод add для указателей функций. Каждому fp присваивается какой-то дескриптор или строка. Позже вы можете вызвать добавленную функцию через какой-то общий метод вызова.

для аргументов функции - вам нужно каким-то образом передать это функции для ссылки на данные класса. Возможно, вы инкапсулируете данные в какую-то структуру и передаете ссылку/указатель на структуру. Для других аргументов вы можете использовать некоторый список указателей или взглянуть на bind.

Помните - это серьезное начинание, поскольку C++ не создается с учетом такого рода вещей.

1

Вы не сможете добавлять методы в объект C++ посредством загрузки динамической библиотеки. Это просто не работает.

Как правило, люди хранят целые объекты в DLL/так ... И даже это боль с C++ (из-за манипуляции с именем). Идиома, которую вы увидите снова и снова, - это единственная функция, объявленная в extern Блок «C», который вы определяете (через dlsym() или что-то еще), который возвращает заводский класс, который может использоваться для создания целого ряда различных объектов.

2

Метод Тобиаса L выше - это единственное решение, которое я вижу как можно больше, реальная трудность приходит (как говорит Т.Л.) мимоходом и связывает аргументы с новыми методами - мне кажется, что большая часть самого технического кода может быть много помогли, используя стандартную функциональность библиотеки boost. В частности, boost :: bind и функция/функциональный материал, по-видимому, обеспечивают много того, что вам может понадобиться, чтобы сделать «методы», следуя «атрибутам» г-на Вольмана.

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