2012-01-03 4 views
1

После многотысячного чтения here и here, я все еще не могу заставить мой код работать. Вот проблема:Вызов внешних участников из общего объекта

У меня есть два класса, Fifo:

#ifdef __cplusplus 
extern "C" { 
#endif 

class Fifo 
{ 
public: 

    Fifo(int len); 
    ~Fifo(); 

    void AddTokens(void* buffer, unsigned len); 

private: 

    // some variables here 

}; 

#ifdef __cplusplus 
} 
#endif 

и другой класс Process_Wrapper:

#ifdef __cplusplus 
extern "C" { 
#endif 


class Process_Wrapper 
{ 
    public: 
     Process_Wrapper(const std::string process_name); 
     Fifo* GetOutputPortIDtoFifoMap(int portID); 
     virtual ~Process_Wrapper(); 
    protected: 
private: 
    //some variables here 
}; 

#ifdef __cplusplus 
} 
#endif 

Функция член Process_Wrapper::GetOutputPortIDtoFifoMap возвращает указатель на инициализированный объект класса Fifo.

Теперь у меня есть общий объект (.so), который скомпилирован с заголовками для классов Fifo и Process_Wrapper. То есть файл .so знает интерфейсы к этим классам.

Я называю это .so файлом от функции-члена от Process_Wrapper (Process_Wrapper::function2) и перейдите к .so указателю - this. Итак, я предполагаю, что общий объект будет знать все о классе Process_Wrapper.

В .so-файле, я пытаюсь вызвать функцию-член Process_Wrapper::GetOutputPortIDtoFifoMap, что, очевидно, не работает. Итак, я попробовал:

Fifo* (Process_Wrapper::*GetFifoMapping)(int) = p1->wptr->GetOutputPortIDtoFifoMap; 

где p1->wptr возвращает указатель на объект Process_Wrapper правильно.

Я потерялся здесь. Я совершенно новичок в этой концепции, и примеры не дают прямого ответа на вопрос. Как мне это сделать?

Кроме того, поскольку я использую C++ 0x/C++ 11, может ли кто-нибудь сказать мне (желательно) решение, используя std :: bind или mem__fun_ref?

Edit: Хорошо, я думаю, что могу уточнить мой вопрос: У меня есть класс Myclass и объект myobject, который является экземпляром этого класса. Myclass имеет функцию-член, принимает некоторые аргументы и возвращает указатель типа PTRTYPE. Как извлечь функцию-член из Myclass для передачи другой функции, чтобы ее можно было использовать как обычный указатель на функцию. Или, в частности: Как извлечь указатель функции из привязанного указателя на функцию-член?

+0

Вы просто хотите передать указатель метода, вот и все? – Geoffroy

+0

Где вы изучали C++? – StackedCrooked

+3

«Как извлечь указатель функции из привязанного указателя на функцию-член?» Вы не можете. –

ответ

1

Чтобы ответить на мой собственный вопрос, я передавал этот «этот» указатель на объект .so. Однако во время выполнения я получал ошибку о том, что символ не найден. Этот символ был «U» или не был отображен в файле .so, но был определен в основном exe («T»), который загружал бы это .so. Все, что мне нужно было сделать, это добавить '-rdynamic' к опции компоновщика, которая создала основной exe.

Очевидно, я не видел, что проблема была такой простой, и моя (неправильная) гипотеза заключалась в том, что проблема была связана с правильным использованием указателя на функцию-член инициализированного объекта.

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

Спасибо всем.

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