У меня ситуация очень похожа на этот вопрос но способ, которым я должен вызвать функцию-член, немного отличается и не может понять это. У меня есть вектор, который содержит команды для выполнения внутри класса. Что мне нужно сделать, это назначить указатель на член того же класса и вызвать его внутри класса. Другими словами, у меня есть класс, который создает серию команд, которые помещаются в векторный массив и вызывают функцию-член. Мне нужно сделать это таким образом, чтобы я мог предварительно инициализировать и настроить команды.
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 */
}
}
Еще раз спасибо, ребята, я надеюсь, что это поможет кому-то еще … Функциональные указатели могут быть грязным делом, используйте с осторожностью …
Задача ещё не решена.
Других решений пока нет …