Указатель функции AVR на функцию-член

У меня ситуация очень похожа на этот вопрос но способ, которым я должен вызвать функцию-член, немного отличается и не может понять это. У меня есть вектор, который содержит команды для выполнения внутри класса. Что мне нужно сделать, это назначить указатель на член того же класса и вызвать его внутри класса. Другими словами, у меня есть класс, который создает серию команд, которые помещаются в векторный массив и вызывают функцию-член. Мне нужно сделать это таким образом, чтобы я мог предварительно инициализировать и настроить команды.

MotionCmd


class MotionManager;

struct MotionCmd{
int id;
int move;
void (MotionManager::*funcPtr)() = NULL;
}

MotionManager


class MotionManager{
std::vector<MotionCmd> stack;

void ConfigureCmd(int id, int move){
MotionCmd cmd;

/* Configure the Cmd */

//This is the only way I can get the assignment is there a way to use 'this->'?
cmd.funcPtr = &MotionManager::LinearMove;
stack.push_back(cmd);
}

void Update(){
//This is another area I am having problems

//Doesn't work Error: "must use '.*' or '->*' to call pointer ...
this->*(this->stack[0].funcPtr)();

//Nope: Error: functPtr was not declared in this scope
this->(cmd.*funcPtr)();

//This doesn't either Error: functPtr was not declared in this scope
this.stack[0].*funcPtr();

//This either Error: functPtr was not declared in this scope
(this->stack[0].*funcPtr)();

//Error: must use '.*' or '->*' to call pointer....
((*this)->*(this->stack[0].funcPtr()))();

}

void LinearMove(){
/* Perform Move */
}
}

Я надеюсь, что это можно сделать таким образом, я просто не уверен, какой синтаксис должен быть. Я прочитал бесчисленное множество статей по этому вопросу, но ничего, что использует указатель так же, как это. Пожалуйста, имейте в виду, что это работает на Mega2560, и что-либо, кроме std :: vector из stdlib, на самом деле не вариант, так как vector — это единственная часть, которую я могу заставить работать из библиотеки StandardCPlusPlus.

Я также пытался сделать функцию статической, но я получил ошибку, что компоновщик не может сделать функцию статической. Что-то не может преобразовать пустоту () аннулировать (MotionManager ::) …

редактировать


JasonC и Антипаттерн сделали меня на правильном пути. Это был действительно способ, которым я пытался овладеть классом MotionManager, используя «this». Как антипаттерн указал «неявный this-указатель, который является первым аргументом любой функции-члена». Так что я задумался об этом на минуту и ​​понял, как заставить все работать, код должен выглядеть так:

MotionManager


class MotionManager{
std::vector<MotionCmd> stack;

void ConfigureCmd(int id, int move){
MotionCmd cmd;

/* Configure the Cmd */

//This is the only way I can get the assignment is there a way to use 'this->'?
cmd.funcPtr = &MotionManager::LinearMove;
stack.push_back(cmd);
}

void Update(){

//Call the Member Function using 'this'...
(this->*(this->stack[0].funcPtr))();

}

void LinearMove(){
/* Perform Move */
}
}

Еще раз спасибо, ребята, я надеюсь, что это поможет кому-то еще … Функциональные указатели могут быть грязным делом, используйте с осторожностью …

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector