Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指向类成员的指针_C++_Boost Spirit_Member Function Pointers - Fatal编程技术网

C++ 指向类成员的指针

C++ 指向类成员的指针,c++,boost-spirit,member-function-pointers,C++,Boost Spirit,Member Function Pointers,我使用的是BoostSpirit解析器,当解析器进行解析时,语义动作会反映到类ParserActions的实例中 以下是解析器的代码(相关部分) 结构化乌尔都语语法:公共语法{ 模板 结构定义{ 定义(乌尔都语语法常量和自我){ prog=(alpha_p>>*alnum_p)[&(self.actions.do_-prog)]; } 规则程序; 规则常数& start()常量{ 返回程序; } }; 常量解析和操作; 显式乌尔都语语法(const parserctions&actions=pa

我使用的是BoostSpirit解析器,当解析器进行解析时,语义动作会反映到类ParserActions的实例中

以下是解析器的代码(相关部分)

结构化乌尔都语语法:公共语法{ 模板 结构定义{ 定义(乌尔都语语法常量和自我){ prog=(alpha_p>>*alnum_p)[&(self.actions.do_-prog)]; } 规则程序; 规则常数& start()常量{ 返回程序; } }; 常量解析和操作; 显式乌尔都语语法(const parserctions&actions=parserctions()):actions(actions){ } };
要获取成员变量或函数的地址,请使用:

&MyClass::MyMember
要调用成员函数指针,请使用以下选项之一:

(my_class.*ptr_to_member)( /* arguments */ )
(my_ptr->*ptr_to_member)( /* arguments */ )

我在谷歌上找到的随机链接提供了更多信息:

要获取成员变量或函数的地址,请使用:

&MyClass::MyMember
要调用成员函数指针,请使用以下选项之一:

(my_class.*ptr_to_member)( /* arguments */ )
(my_ptr->*ptr_to_member)( /* arguments */ )

我在Google上找到的随机链接提供了更多信息:

函数指针和成员函数指针之间有一个根本的区别:

  • 必须使用正确类型的参数调用函数指针

  • 必须使用正确类型的对象和正确类型的参数调用成员函数指针

像从对象生成成员函数指针一样,构建成员函数指针不会在指针中注册该对象


如果您想要这样的东西,有各种各样的库可以这样做(您有一个boost标签,请参阅bind和signals以获取此类示例)。

函数指针和成员函数指针之间有一个根本的区别:

  • 必须使用正确类型的参数调用函数指针

  • 必须使用正确类型的对象和正确类型的参数调用成员函数指针

像从对象生成成员函数指针一样,构建成员函数指针不会在指针中注册该对象


如果您需要这样的功能,可以使用各种库(您有一个boost标记,请参阅bind和signals以获取此类示例)。

为了调用对象的成员函数,您需要提供两种功能:

  • 成员函数的地址,如前所述,您可以通过编写
    &my_class::my_member
  • 指向要调用成员函数的对象实例的指针(或引用)
  • Spirit语义操作期望您提供一个函数或函数对象来公开某个接口。在您的情况下,预期的接口是:

    void func(Iterator first, Iterator Last);
    
    其中,迭代器是用于调用解析函数的迭代器类型(可通过
    typename ScannerT::Iterator\u t
    访问)。您需要做的是创建一个函数对象,公开所提到的接口,同时仍然调用您的成员函数。虽然这可以手动完成,但这样做充其量也很乏味。创建函数对象的最简单方法是使用Boost.Bind:

    prog = (alpha_p >> *alnum_p)
           [
               boost::bind(&ParserActions::do_prog, self.action)
           ];
    
    这将为您创建所需的函数对象,绑定和包装您的成员函数

    所有这些都假定您的成员函数不接受任何参数。如果您需要传递这对迭代器,语义操作将被调用,函数的构造需要写成:

    prog = (alpha_p >> *alnum_p)
           [
               boost::bind(&ParserActions::do_prog, self.action, _1, _2)
           ];
    

    指示函数对象将其第一个和第二个参数转发给绑定函数。

    要调用对象的成员函数,需要提供两件事:

  • 成员函数的地址,如前所述,您可以通过编写
    &my_class::my_member
  • 指向要调用成员函数的对象实例的指针(或引用)
  • Spirit语义操作期望您提供一个函数或函数对象来公开某个接口。在您的情况下,预期的接口是:

    void func(Iterator first, Iterator Last);
    
    其中,迭代器是用于调用解析函数的迭代器类型(可通过
    typename ScannerT::Iterator\u t
    访问)。您需要做的是创建一个函数对象,公开所提到的接口,同时仍然调用您的成员函数。虽然这可以手动完成,但这样做充其量也很乏味。创建函数对象的最简单方法是使用Boost.Bind:

    prog = (alpha_p >> *alnum_p)
           [
               boost::bind(&ParserActions::do_prog, self.action)
           ];
    
    这将为您创建所需的函数对象,绑定和包装您的成员函数

    所有这些都假定您的成员函数不接受任何参数。如果您需要传递这对迭代器,语义操作将被调用,函数的构造需要写成:

    prog = (alpha_p >> *alnum_p)
           [
               boost::bind(&ParserActions::do_prog, self.action, _1, _2)
           ];
    

    指示函数对象将其第一个和第二个参数转发给绑定函数。

    您能给出操作结构/如何定义扩展吗?您能澄清boost spirit标签吗?如果您发布更多代码(例如,从函数f1),您可能会得到更好的答案以及编译器给你的确切错误消息。你能给出操作的结构/如何定义扩展吗?你能澄清boost spirit标签吗?如果你发布更多的代码(例如从函数f1)和编译器给你的确切错误消息,你可能会得到更好的答案。谢谢,我仍然对此有一些问题。“self”不应该是self.actions,并且参数的顺序更改为boost::bind(&ParserActions::do_prog,self,_1,_2),根据我修复了上面答案中的代码以反映正确的语法。谢谢,我仍然遇到一些问题。“self”不应该是self.actions,并且参数的顺序更改为boost::bind(&ParserActions::do_prog,self,_1,_2),根据我在上面的答案中修复的代码,以反映正确的语法。