1

我正在使用一个解析数据的模板类。每行数据都需要调用两个函数之一来处理数据。这个决定是在构造解析器时确定的,并且取决于传递给构造函数的变量。我认为为此使用函数指针会很有用,这样我就可以在构造函数中使用一个 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);
    }
    /* . . . */
}
4

2 回答 2

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);
    }

    // ...
};
于 2013-04-22T20:06:36.560 回答
2

该错误很可能来自使用函数指针指向成员函数。类中的函数和普通函数之间存在相当大的差异。您正在将类函数分配给普通函数指针。当您考虑所有成员函数都将隐藏this指针作为其第一个参数时,差异就出现了。

要么将函数更改为在类之外(或者如果函数不需要任何类的变量、基数或this指针,则使用静态函数)或将函数指针更改为类成员函数指针。指向接受字符串的 MyClass 函数的指针将如下所示。

void (MyClass::*fptr)(std::string str);

因为类函数指针需要一个隐藏this指针,所以函数指针的调用也会发生变化。要调用 fptr 指向的函数,您可以使用->*or .*c++ 运算符。因此,要使用 MyClass 的指针调用它this,您可以这样做:

std::string aString;
(this->*fptr)(aString);

我不完全确定,但也许可以用虚函数来做你希望做的事情?这可以通过拥有两个单独的类和一个指向两者之一的实例的指针来实现。这两个类都派生自一个具有纯虚函数的类,该纯虚函数与您在此处分配的函数相同。这是比使用函数指针更简洁的解决方案。我会对此进行研究,因为如果您使用函数指针寻找动态行为,您可能会发现它很有用。

这是一个关于函数指针基础的很好的教程:

http://www.learncpp.com/cpp-tutorial/78-function-pointers/

于 2013-04-22T20:14:47.693 回答