2014-09-18 2 views
0

Я создаю приложение с классом, который имеет несколько методов анимации. Мне нужно, чтобы эти методы анимации вызывались случайным образом. Итак, моя идея состояла в том, чтобы создать вектор указателей функции void и выполнить итерацию по вектору. Однако я не могу его скомпилировать. Я получаю сообщение об ошибке: "invalid use of void expression".Вектор указателей функции void с параметрами C++

Применимо код:

.h

std::vector<void(*)(int,float)> animationsVector; 
void setAnimations(); 
void circleAnimation01(int circleGroup, float time); 

.cpp

polygonCluster01::polygonCluster01() 
{ 
    setAnimations(); 
} 

void polygonCluster01::setAnimations() 
{ 
    animationsVector.push_back(circleAnimation01(1,2.0)); //error is here 
} 

void polygonCluster01::circleAnimation01(int circleGroup, float animLength) 
{ 
    //other code 
} 

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

+2

Ваш параметр 'push_pack' - это вызов функции, а не указатель на функцию. У указателей функций нет параметров с ними. Вам нужно будет сохранить указатель функции * плюс * параметры отдельно. – crashmstr

ответ

5

polygonCluster01::circleAnimation01 не является отдельно стоящей функцией, а функцией-членом. Таким образом, для хранения его адреса требуется функция-функция-указатель. Вот тип вы ищете:

std::vector<void(polygonCluster01::*)(int,float)> animationsVector; 
//    ^^^^^^^^^^^^^^^^^^ 

Edit: давайте завершить этот ответ.

Когда вы даете правильный тип вашему вектору, он все равно не будет скомпилирован. Это связано с тем, что, как указано crashmstr, указатели на функции и указатели функций-членов - это только указатель на функцию (член). В частности, они не могут хранить параметры для последующего использования, которые вы пытаетесь сделать.

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

Ну, C++ 11 вы накрыли! Взгляните на std::function. Это контейнер с стиранием типа, предназначенный для выполнения только того, что написано выше. Вы можете использовать его следующим образом:

std::vector<std::function<void(polygonCluster01*)>> animationsVector; 

... 

animationsVector.push_back(std::bind(
    &polygonCluster01::circleAnimation01, // Grab the member function pointer 
    std::placeholders::_1, // Don't give a caller for now 
    1, 2.0 // Here are the arguments for the later call 
)); 

... 

animationsVector[0](this); // Call the function upon ourselves 
+0

да, но как насчет проблемы с push_back? – zoska

+0

@zoska вот он :) – Quentin

0

Ваш вектор содержит указатели на функции, а не результат функции, которую вы вызываете там.

animationsVector.push_back(circleAnimation01(1,2.0));

Используйте это вместо

animationsVector.push_back(circleAnimation01);

The invalid use of void expression, что вы получаете, потому что вы пытаетесь сохранить результат вызова на circleAnimation01 функции, которая void вместо указателя к функция, которая возвращает void после получения int и float.

Кроме того, как заявил Квентин, они необходимы для того, чтобы они были функциями, а не функциями-членами, либо меняли сигнатуру вектора, либо меняли эти члены на свободные функции.

+0

Спасибо за объяснение, эта ошибка имеет большой смысл сейчас. – anthony

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