类成员函数上的函数指针

乔纳森·莱杜赫
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; 我不能将vm的func设置为静态。当一个函数“捕获”对象时,为什么不能在函数上有指针?也许类型错误,这是一些.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();
斯蒂芬·谢勒(Stefan Scheller)

正如IlCapitano所写,您必须使用特定的语法来处理指向成员的指针。这是一个示例(与一起编译g++ tmp.cpp -o tmp):

#include <iostream>
#include <string>
#include <vector>

class Virtual_Machine
{
    private:
        std::string name;

    public:
        Virtual_Machine(std::string n) : name(n) {}
        void clear() { std::cout << "Clear " << name << std::endl; }
};

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

    public:
        Parser(std::string vm_name) : vm(vm_name) {}
        void add_func_no_arg(void (Virtual_Machine::* f)(), std::string command)
        {
            command_no_arg.push_back(command);
            func_no_arg.push_back(f);
        }
        void prepare()
        {
            add_func_no_arg(&Virtual_Machine::clear, "clear");
        }
        void test()
        {
            (vm.*(func_no_arg[0]))();
        }
};

int main()
{
    Parser a("vm_a"), b("vm_b");

    a.prepare();
    b.prepare();

    a.test();
    b.test();

    return 0;
}

该程序的输出为:

Clear vm_a
Clear vm_b

的指针成员函数clear类的一个实例的Virtual_Machine与创建&Virtual_Machine::clear要稍后调用此函数,您必须使用运算符.*在运算符->*的左侧使用类的实例,并在右侧使用指向函数的指针,例如(vm.*(func_no_arg[0]))()如果函数具有参数,则可以将其放在最右边的一对括号中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

模板类的成员函数指针

来自分类Dev

指向类的成员函数的指针

来自分类Dev

指向类成员函数的指针

来自分类Dev

指向类成员函数的函数指针

来自分类Dev

从类成员函数返回函数指针

来自分类Dev

从const成员函数返回类成员的指针

来自分类Dev

成员函数指针作为模板论证在继承的成员函数上失败,如何以及为什么?

来自分类Dev

模板函数上的 C++ 模板类成员

来自分类Dev

指向类模板成员的函数指针

来自分类Dev

如何通过指针从函数访问类的成员?

来自分类Dev

通过指向类成员的指针调用函数

来自分类Dev

返回指向类成员函数的指针

来自分类Dev

如何获得成员函数指针的类?

来自分类Dev

派生类上的成员函数指针

来自分类Dev

传递指针以将类乘以成员函数

来自分类Dev

当前类成员函数的指针数组

来自分类Dev

指向类成员的 C++ 函数指针

来自分类Dev

如何通过函数指针递归调用类成员函数?

来自分类Dev

类复制构造函数和指向成员的指针函数

来自分类Dev

如何通过本身是类成员的指针调用成员函数

来自分类Dev

成员字段的成员函数上的 std::async

来自分类Dev

将派生类中的成员函数的指针强制转换为抽象成员函数的指针

来自分类Dev

在类定义C ++之前使用类成员函数指针

来自分类Dev

指向成员函数的函数指针

来自分类Dev

指向成员函数的函数指针

来自分类Dev

继承成员函数指针

来自分类Dev

指向成员函数的指针

来自分类Dev

调用成员函数指针

来自分类Dev

指向成员函数的指针