2015-10-03 1 views
1

Я пытаюсь сделать что-то вроде этого: Создайте объект и привяжите его функции-члены к функциям из DLL. Например,Установить функцию члена C++ для функции из DLL

class A { 
private: 
int a; 
public: 
void func_a(); 
}; 

При загрузке из библиотеки DLL Я хочу создать Объект и установить func_a к функции, которая загружается из DLL

A aObj; 
(aObj.*func_a)() = getAdr(&s, h, "fmiGetTypesPlatform"); 

Я не знаю синтаксис для него , но я имею в виду, я хочу, чтобы установить результат

getAdr(&s, h, "fmiGetTypesPlatform"); 

для функции члена объекта

Спасибо заранее.

+0

Вы имеете в виду стороннюю сборку DLL? Вы не можете. Просто используйте класс с «однострочными» методами. – Matt

+0

Если это _your_ DLL, вы можете «экспортировать» весь класс C++. – Matt

+0

Это 3-й сторонник готовой DLL – memduha

ответ

0

Что вы ищете это указатель функции:

class A { 
private: 
    int a; 
public: 
    void (*func_a)(); 
}; 

Затем, вы можете установить это, как и любой другой указатель.

A aObj; 
aObj.func_a = getAdr(&s, h, "fmiGetTypesPlatform"); 

Обратите внимание, что ссылочная функция fmiGetTypesPlatform() является обычной функцией. Это не метод класса (т. Е. Нет это и др.), И он вызывается посредством его функционального указателя.

(*aObj.func_a)(); 
+0

Сначала я искал решение без использования указателя на функцию, но я думаю, что другого выхода нет. Теперь, если указатели функции потребности, то я хочу создать класс B, который является производным от класса A, и содержит указатель на функцию func_a. Как я могу использовать A (указатель базового класса) для вызова указателя функции B, который будет подключен к DLL? – memduha

+0

Добавить виртуальный класс метода A. Реализовать виртуальный метод в классе B, который вернет указатель. Но, мне кажется, что вам вообще не нужен указатель на функцию. Это первый раз, когда наследование классов упоминается. Мне кажется, что виртуальные методы - это все, что нужно. Виртуальный метод в классе B - это ваша функция, которую вы намереваетесь вызывать через указатель. За исключением того, что нет указателя. Просто метод виртуального класса. –

0

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

Если вы хотите иметь возможность назначать произвольные функции членам класса, указатели на функции будут работать с небольшой дополнительной настройкой. Пример кода: http://goffconcepts.com/techarticles/calldll.html

Обратите внимание, что вы можете вызвать указатель функции, сохраненный как член класса по имени, как если бы это была функция, с обычным синтаксисом object.func(). Фактически, это то, как реализуются функции виртуального члена, под капотом.

Если, однако, вызовы не являются статическими, вы все равно можете поместить вокруг них обертку, чтобы вы могли сделать данные, которые они используют для своего класса.

+0

Сначала я искал решение без использования указателя функции, но я думаю, что другого пути нет. Теперь, если указатели функции потребности, то я хочу создать класс B, который является производным от класса A, и содержит указатель на функцию func_a.Как я могу использовать A (указатель базового класса) для вызова указателя функции B, который будет подключен к DLL? – memduha

+0

Объявите соответствующую функцию в A 'virtual' и, возможно, установите ее' = 0'. – Davislor