Вектор указателей на функцию void с параметрами C ++

0

Я создаю приложение с классом, который имеет несколько методов анимации. Мне нужно, чтобы эти методы анимации вызывались случайным образом. Итак, моя идея состояла в том, чтобы создать вектор указателей функции 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
}

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

  • 2
    Ваш параметр push_pack - это вызов функции, а не указатель на функцию. Указатели на функции не имеют параметров с ними. Вам нужно будет хранить указатель функции и параметры отдельно.
Теги:

2 ответа

5
Лучший ответ

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
  • 0
    да, но как насчет проблемы с push_back?
  • 0
    @zoska вот оно :)
0

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

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

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

animationsVector.push_back(circleAnimation01);

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

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

  • 0
    Спасибо за объяснение, эта ошибка теперь имеет большой смысл.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню