2015-12-07 4 views
0

У меня есть проблема с вызовом указателя функции на карте в C++.Указатель функций из другого класса C++

это моя функция типа указателя:

typedef int (AEvent::*setFunction)(); 

это моя карта:

std::map<const std::string, setFunction *>  _actions; 

так я найти свою функцию, как это:

auto mem = this->_actions.find("SHOOT")->second; 

и теперь, как я могу назвать функцию?

Заранее благодарим за ваш ответ.

+1

Это не функциональные указатели. Это указатели на функции * member *. Вы не можете «вызвать» функцию-член; скорее, вам нужен объект, на который вы его вызываете. Например, нет смысла спрашивать, как вызвать 'std :: string :: clear'; вам нужен фактический строковый объект для очистки. –

+0

Но я не могу этого сделать, потому что, если я создаю объект AEvent, я не могу создать экземпляр его чистой виртуальной функции. –

+0

Вы уверены, что отображенный тип верен? Почему указатель на указатель? –

ответ

1

Предположим, что у вас есть иерархия классов следующим образом:

class AEvent 
{ 
public: 
    virtual int Bar() = 0; 
}; 

class Derived : public AEvent 
{ 
public: 
    virtual int Bar() override 
    { 
     // Return something. 
     return 100; 
    } 
}; 

Вы можете вызвать указатель на функцию-член, который виртуальный следующим образом:

AEvent * my_object = GetDerived(); 

auto func = this->_actions.find("SHOOT")->second; 

(my_object->*func)() // Invoke 'func' 

Если вы вызываете указатель помните, что вы несете ответственность за правильность указания указателя , который в этом случае должен быть my_object

+0

Я сделал это, но теперь есть доступ к нарушениям, как в моем предыдущем коде –

+0

Ошибка нарушения доступа, похоже, больше не относится к вашему исходному вопросу. Однако, если я подробно опишу, ваш 'mem' должен указывать действительный адрес для функции-члена, но' my_object' (или то, что вы назвали его), должно быть несколько проблематичным, возможно, разыменованием 'nullptr'. –

+0

ОК, поэтому мой код был хорошим. Теперь у меня проблема с sfml;) Большое спасибо :) –

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