2017-02-17 18 views
-1

У меня есть класс сущностей, который обрабатывает выбор сущностей. В этом классе у меня есть вектор функций, которые передаются в пользовательский интерфейс, который будет отображаться в выпадающем меню. Я хочу иметь возможность создавать функции в моих классах, которые наследуют объект, но передают эти функции из объекта в пользовательский интерфейс. Любые идеи о том, как я это сделаю?Параметр функции C++, определяемый дочерними объектами

Что я наделал?

Я добавил защищенный вектор для лица:

std::vector<void (*)()> dropDownFunctions; 

функция для пользовательского интерфейса:

void renderDropDown(std::vector<void(*)()> dropDownFunctions); 

Это та функция:

private: 
    void calculateFOV(); 

А затем попытался изменить вектор в классе, который унаследовал объект:

dropDownFunctions.push_back(&PlayableCharacter::calculateFOV); 

Я получаю ошибку:

no instance of overloaded function "std::vector<_Ty, _Alloc>::push_back [with _Ty=void (*)(), _Alloc=std::allocator<void (*)()>]" matches the argument list 
+4

Что ваш сделали? Пожалуйста, покажите нам свою попытку. – WhiZTiM

+2

В коде говорится более тысячи фотографий. Попробуйте создать [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve) и покажите нам. –

+0

Я добавил свою попытку – genfy

ответ

1

calculateFOV является нестатической функцией, поэтому она имеет неявный this параметр. Принимая его адрес как &PlayableCharacter::calculateFOV, выдается тип void (PlayableCharacter::*)(), a указатель-член-функция или PTMF, который несовместим с void(*)().

Предполагая PlayableCharacter происходит от Entity, вы можете попробовать:

typedef void (Entity::* DropDownFn)(); 
std::vector<DropDownFn> dropDownFunctions; 

, а затем,

dropDownFunctions.push_back 
        (static_cast<DropDownFn>(&PlayableCharacter::calculateFOV)); 
+0

Я меняю только 'std :: vector ' или есть что-то еще? Такая же ошибка возникает с или без chage: 'Типы аргументов: (void (PlayableCharacter :: *)())' 'Тип объекта: std :: vector ' – genfy

+0

@genfy Извините, это преобразование должно быть явным, то есть' static_cast'. Это только неявный переход от базы к выведенному, что часто кажется отсталым. – Potatoswatter