一次又一次......指向成员函数的指针

时间:2011-01-12 12:15:26

标签: c++ function-pointers

假设:

class Parser
{
  public:
  void parser1(int a, int b, int c);
  void parser2(int d, int e, int f);
  void setupPtr();

  void (Parser::*ptrParser) (int param1, int param2, int param3);
}

Parser::setupPtr()
{
   if(bla bla)
   {
       ptrParser = &Parser::parser1;
   }
   else
   {
       ptrParser = &Parser::parser2;
   }
}

在main中:

int main(argv, argc)
{
   Parser parser;
   parser.setupPtr();
// first case
   parser.ptrParser(some paramps); // error!    error C2064: term does not evaluate to a function taking 3 arguments
// second case
   parser.*ptrParser(some paramps); // error!   'ptrParser' : undeclared identifier
// third case
   (parser.*ptrParser)(some paramps); // error!     'ptrParser' : undeclared identifier


}

4 个答案:

答案 0 :(得分:3)

鉴于您要将ptrParser字段更改为公开,您需要以这种方式编写main

int main()
{
   Parser parser;
   parser.setupPtr();
   (parser .* (parser.ptrParser))(1, 2, 3);
   return 0;
}

让我们试着理解这条线。

首先,调用void (Parser::*)(int, int, int)类型的指向成员函数的函数,给定一个名为Parser的{​​{1}}实例和一个指向成员函数的指针{{1语法是:

inst

在我们的示例中,实例名为func,指向成员函数的指针存储在(inst .* func)(x, y, z); 类的parser字段中,该字段使用{{ 1}}语法。在前一个表达式中替换它,这给了我们(添加括号,因为我不确定运算符优先级):

ptrParser

如果我们有一个指向parser的指针而不是引用或对象,则语法为:

parser.ptrParser

答案 1 :(得分:1)

关于(几乎)所有形状和大小的函数指针的精彩介绍/教程:http://www.newty.de/fpt/index.html

我相信你正在寻找第3.5部分。

答案 2 :(得分:0)

我发现此代码存在两个问题。

1)ptrParser未分配任何内容。你需要先调用Parser :: setupPtr。

2)ptrParser是指向不带参数的方法的方法指针,简而言之,您必须将其定义为包含参数。我认为如果你在调用它之前将它转换成它,你仍然可以逃脱它,但最好还是保持这些简单。

特定示例的方法指针声明如下:

  void (Parser::*ptrParser) (int, int, int);

答案 3 :(得分:0)

我可以建议您为函数ptr类型创建一个typedef:

typedef void (Parser::*funcptr) (int , int , int );

然后创建你的竞争者:

class Parser
{
public:
typedef void (Parser::*funcptr) (int , int , int );

void parser1(int a, int b, int c);
void parser2(int d, int e, int f);
void setupPtr();

funcptr firstptr;
}

设置它:

firstptr = &Parser::parser1;

称呼它:

Parser foo;
foo.setupPtr;
(foo.*(foo.firstptr))(1, 2, 3);

理解起来不那么难,你将能够创建funcptr数组......