【问题标题】:Accessing member function from member function array从成员函数数组访问成员函数
【发布时间】:2012-11-14 00:19:19
【问题描述】:

我已将几个成员函数分组到一个数组中。如何从数组中访问函数?我收到“错误 C2064:术语不评估为采用 0 个参数的函数。”见下文。

class A
{
public:

    //Constructor
    A()
    {
        //Fill function array
        ClipFunction[0] = &A::ClipTop;
        ClipFunction[1] = &A::ClipBottom;
        ClipFunction[2] = &A::ClipLeft;
        ClipFunction[3] = &A::ClipRight;
    }

    //Declare array
    typedef void (A::*ClipFunction_ptr) ();
    ClipFunction_ptr ClipFunction[4];

    //Clipping functions
    void ClipTop();
    void ClipBottom();
    void ClipLeft();
    void ClipRight();

    //Start clipping process
    void StartClip();

};

//Define clipping functions
void A::ClipTop() {}
void A::ClipBottom() {}
void A::ClipLeft() {}
void A::ClipRight() {}

//Define A::StartClip()
void A::StartClip()
{
    //Run through all functions in the array
    for (unsigned int i = 0; i < 4; i++)
    {
        ClipFunction[i](); //ERROR. How do I access ClipFunction[i] ???
    }

}   

【问题讨论】:

标签: c++ arrays function pointers member


【解决方案1】:

您需要像这样取消引用该函数: this->(*ClipFunction[i])();

您缺少的是 this 或者编译器抱怨它没有第一个参数(调用成员函数的对象的实例)将其传递给函数。

对于编译器的成员函数: void A::ClipFunction() { }

翻译成类似这样的东西: void ClipFunction(A* this) { }

因此错误抱怨该函数不是采用零参数的函数。

【讨论】:

    【解决方案2】:

    我认为问题在于您需要像 http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/topic/com.ibm.xlcpp8l.doc/language/ref/cplr034.htm 中那样明确使用“this”。

    所以在你的情况下,你应该使用

        (this ->* ClipFunction[i]) ();
    

    而不是

        ClipFunction[i]();
    

    PS

    当我回复这个帖子时,我没有看到 Vite Falcon 的回答。基本上我们说的是同样的事情,但我认为他的代码“this->(*ClipFunction[i])()”不会编译,因为 GCC 在我的机器上给出了错误。 "(this->*ClipFunction[i])()" 是正确的形式。

    【讨论】:

      【解决方案3】:

      我认为您不希望在 typedef 中使用范围解析运算符 ::。而是尝试放置

          typedef void (*ClipFunction_ptr) ();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-29
        • 2015-04-01
        • 2022-01-03
        • 2012-10-08
        • 2022-01-10
        • 1970-01-01
        • 2019-10-16
        • 1970-01-01
        相关资源
        最近更新 更多