假设:
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
}
答案 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数组......