Type object;
typedef ReturnType (Type::*MethodType)(ParamType1, ParamType2);
...
MethodType method = &Type::ourMethod;
Type * objPtr = &object;
...
(objPtr->*method)(param1, param2);
Изврат с методоми. Как?
Итак, предположим, есть некое приложение, и к нему набор модулей.
Модули представляют собой DLL, которые экспортируют единственную функцию GetInterface(),
которая принимает в качестве единственного параметра ссылку на структуру, и инициализирует её.
В дальнейшем, вся работа с модулем идёт через указатели на функции в структуре.
У всех этих функций первым параметром передаётся ссылка на вышеупомянутую структуру. Типа методы. :)
Само приложение будет написано на чистом Си, и являться некой средой, модули же будут взаимодействовать между собой.
Теперь о том, что же именно нужно, и при чём тут C++. А нужно вот что:
Нужно как то представить структуру в виде класса с методами, чтобы не в первом параметре передавать ссылку на структуру, автоматически передавалась бы ссылка this.
Это нужно для того, чтобы иметь возможность разрабатывать модули как на чистом Си, так и на на C++, и работать с интерфейсами других модулей объектно, как с экземплярами класса.
Но вот не пойму, как лучше реализовать. Нестатические методы не имеют адреса функции, а статическим не передаётся указатель this скрытым параметром.
Цитата: kisssko
Нестатические методы не имеют адреса функции
Имеют, куда они денутся то? Только вызывать их разумеется надо все равно у объекта, чтобы this подставился.
Код:
=)
Вобще плохо понял, что ты хочешь, но возможно тебе стоит создать просто в интерфейса в DLL - один для C, другой для C++ если уж ты хочешь полноценные C++ классы из DLL брать? По крайней мере это простое и логичное решение.
Или действительно использовать дополнительный интерфейс для С++ - скажем, factory-function, возвращающий указатель на объект той самой структуры
Других возможных решений, кроме класса-обёртки Нездешнего и полиморфного гибрида, способных сохранить соответствующий с++интаксис без модификации компилера... :confused:
P.S. Реализации ОО у всех разные. Это, кажется, у борланда указатель this передаётся в ecx?! Может это для Вас играет роль, но любое рещение не есть переносимым. Обёртка хороша тем, что её интерфейс будет совместимым на уровне исходников, но не реализация.