Я создаю приложение с классом, который имеет несколько методов анимации. Мне нужно, чтобы эти методы анимации вызывались случайным образом. Итак, моя идея состояла в том, чтобы создать вектор указателей функции void и выполнить итерацию по вектору. Однако я не могу его скомпилировать. Я получаю сообщение об ошибке: "invalid use of void expression"
.
Применимый код:
.час
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
}
Я следил за некоторыми другими сообщениями, которые предполагают, что я делаю это правильно, но он все равно не будет компилироваться, и я не уверен, почему.
polygonCluster01::circleAnimation01
не является автономной функцией, а функцией-членом. Таким образом, вам нужен указатель функции-члена для хранения его адреса. Вот тип, который вы ищете:
std::vector<void(polygonCluster01::*)(int,float)> animationsVector;
// ^^^^^^^^^^^^^^^^^^
Изменить: давайте закончить этот ответ.
Когда вы даете правильный тип вашему вектору, он все равно не будет компилироваться. Это связано с тем, что, как указано crashmstr, указатели на функции и указатели функций-членов - это только указатель на функцию (член). В частности, они не могут хранить параметры для последующего использования, которые вы пытаетесь сделать.
Так что вам на самом деле нужен не простой (член) указатель на функцию, а то, что может обернуть функцию и некоторые параметры, чтобы вызвать ее позже.
Ну, С++ 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
Ваш вектор содержит указатели на функции, а не результат функции, которую вы вызываете там.
animationsVector.push_back(circleAnimation01(1,2.0));
Используйте это вместо этого
animationsVector.push_back(circleAnimation01);
invalid use of void expression
которое вы получаете, состоит в том, что вы пытаетесь сохранить результат circleAnimation01
функции circleAnimation01
который является void
вместо указателя на функцию, которая возвращает void после получения int и float.
Кроме того, как заявил Квентин, вам нужно, чтобы они были функциями, а не функциями-членами, либо меняли сигнатуру вектора, либо меняли эти члены на свободные функции.
push_pack
- это вызов функции, а не указатель на функцию. Указатели на функции не имеют параметров с ними. Вам нужно будет хранить указатель функции и параметры отдельно.