首页 > 解决方案 > 类成员函数上的函数指针

问题描述

void Parser::add_func_no_arg(void (Virtual_Machine::*f)(), std::string comand)
{
    command_no_arg.push_back(comand);
    func_no_arg.push_back(f);
}

void Parser::prepare()
{
    //add_func_no_arg(Virtual_Machine::dump,"dump"); it work when i put it in static but i cant do that
    add_func_no_arg(vm.clear,"clear"); // ERROR HERE the vm.clear does not fit
}

我有这两个函数可以帮助我创建一个指针数组 func_no_arg; 我不能把虚拟机的函数放在静态的;当一个函数被“陷阱”在一个对象中时,为什么我不能在函数上有一个指针?也许类型是错误的,这里有一些 .hpp :

class Parser {
    public:
       /***/
        void prepare();
        void add_func_no_arg(void (Virtual_Machine::*f)(), std::string comand);

    private:
        Virtual_Machine vm;
        std::vector<std::string> command_no_arg;
        std::vector<void (Virtual_Machine::*)()> func_no_arg;
        /***/

};


class Virtual_Machine {
    public:
      /***/
        void clear();
      /***/
}

编译器这样说:

Parser.cpp: In member function ‘void Parser::prepare()’:
Parser.cpp:65:36: error: invalid use of non-static member function ‘void Virtual_Machine::clear()’
     add_func_no_arg(vm.clear,"dump");
                                    ^
In file included from ../include/Parser.hpp:13,
                 from Parser.cpp:8:
../include/VM.hpp:23:14: note: declared here
         void clear();

标签: c++classfunction-pointers

解决方案


获取指向成员的指针的语法是&Virtual_Machine::clear(not ),并且可以使用运算符 (例如)在 的实例上调用这种类型vm.clear的变量。fVirtual_Machine.*vm.*f()

或者,您可以编写&decltype(vm)::clear不依赖于类名的 。


推荐阅读