如何从另一个方法调用指向方法的指针

时间:2010-03-03 23:35:57

标签: c++ function-pointers member-function-pointers

前段时间我遇到了这个问题,但我放弃了,但最近又回来了。

#include <iostream>

class element2D;

class node2D
{
public:
    void (element2D::*FunctionPtr)();
    void otherMethod()
    { std::cout << "hello" << std::endl;
        ((this)->*(this->FunctionPtr))(); //ERROR<-------------------
    }

};

class element2D
{
public:
    node2D myNode;
    void doSomething(){ std::cout << "do something" << std::endl; }
};

int main()
{
    element2D myElement;

    myElement.myNode.FunctionPtr = &element2D::doSomething; //OK
    ((myElement).*(myElement.myNode.FunctionPtr))();        //OK

    return 0;
}

我在标记的行上收到错误:

pointer to member type 'void (element2D::)()' incompatible with object type 'node2D'

我真的很感谢你的帮助。今天有类似的问题部分帮助了我:link。 但它似乎并不是我问题的完整答案。

实际上这两个问题只有一个区别 - 调用函数的地方。

感谢您的时间

2 个答案:

答案 0 :(得分:5)

“this”是指向node2D的指针,但FunctionPtr指的是element2D的成员 - 这是错误。

#if 0 //破碎的版本

void otherMethod()
{ std::cout << "hello" << std::endl;
    ((this)->*(this->FunctionPtr))(); //ERROR<-------------------
}

#else //固定版本

void otherMethod( element2D * that )
{ std::cout << "hello" << std::endl;
    ((that)->*(this->FunctionPtr))();
}

#ENDIF

然后用类似的东西来调用它:

myElement.myNode.otherMethod( &myElement );

你可以采取一些措施来改善这一点,但这应该可以让你开始。

答案 1 :(得分:0)

如果要调用指向element2D成员的指针,则需要指向element2D对象的指针。考虑使用Boost.Function或Boost.Signals2来实现您想要的功能。