我正在使用一个解析数据的模板类。每行数据都需要调用两个函数之一来处理数据。此决定是在构造解析器时确定的,并且取决于传递给构造函数的变量。我认为为此使用函数指针是有用的,这样我就可以在构造函数中使用一个if语句,并将正确的函数分配给将在程序体中使用的函数指针。我收到一个我无法弄清楚的错误,如果我在此上下文中正确使用函数指针,我很好奇。
template<class T1, class T2>
class MyClass{
protected:
void (*pDoSomething)(std::string,std::string,std::string);
void functionOne(std::string,std::string,std::string);
void functionTwo(std::string,std::string,std::string);
public:
MyClass(bool option);
void parseData();
};
templace<class T1, class T2>
MyClass<T1,T2,>::MyClass(bool option){
if (option) pDoSomething = &functionOne;
else pDoSomething = &functionTwo;
}
template<class T1, class T2>
void MyClass<T1,T2>::parseData(){
/* . . . */
while(dataToParse){
*pDoSomething(string1, string2, string3);
}
/* . . . */
}
答案 0 :(得分:3)
像这样改变:
template<class T1, class T2>
class MyClass
{
typedef void (MyClass::*ptmf)(std::string, std::string, std::string);
ptmf the_function;
explicit MyClass(bool b)
: the_function(b ? &MyClass::functionOne : &MyClass::functionTwo)
{ }
void parse_data()
{
(this->*the_function)(s1, s2, s3);
}
// ...
};
答案 1 :(得分:2)
错误最有可能是使用函数指针指向成员函数。类中的函数与正常函数之间存在相当大的差异。您正在为正常的函数指针分配一个类函数。当您考虑所有成员函数将隐藏的this
指针作为其第一个参数时,会出现差异。
将函数更改为类外部(或者如果函数不需要任何类的变量,基数或this
指针,则使用静态函数)或将函数指针更改为类成员功能指针。指向带有字符串的MyClass函数的指针将如下所示。
void (MyClass::*fptr)(std::string str);
因为类函数指针需要隐藏的this
指针,所以函数指针的调用也会改变。要调用fptr指向的函数,可以使用->*
或.*
c ++运算符。因此,要使用MyClass的this
指针调用它,您可以这样做:
std::string aString;
(this->*fptr)(aString);
我不完全确定,但也许可以做你希望用虚拟功能做的事情呢?这可以通过具有两个单独的类和指向两者之一的实例的指针来实现。这两个类派生自一个具有纯虚函数的类,该函数与您在此处指定的函数相同。这比使用函数指针更简洁。我会调查一下,因为如果你使用函数指针寻找动态行为,你会发现它很有用。
这是一个关于函数指针基础知识的好教程: