如何将非静态函数作为参数传递给函数指针?

想将函数指针作为参数调用,却发现必须是静态指针吗?

打个比方,我写了一个树类Tree,其中包含树的根节点.每个节点都记录了自己的儿子.
其中有一个dps函数,第一个参数是要遍历的节点,第二个参数是要对该节点做的事情.

class Tree
{
    Node * root;
    void dps(Node * t,void (*work)(Node * n));
    void work1(Node*n);
    void work2(Node*n);
    void work3(Node*n);
    //...
}

这么一个结构.
但我试图运行dps(root,work1)的时候,我发现它要求work1必须是静态函数?
而如果我把work1设置成静态函数,它会很麻烦,因为它还使用了Tree类里的其他成员.
这种场合我该怎么做比较好?

阅读 835
2 个回答
class Node{};
class Tree
{
public:
    Node * root;
    void dps(Node * t,void (Tree::*work)(Node * n)){
        (this->*work)(t);
    };
    void work1(Node*n){};
};
void foo() {
    Node n;
    Tree t;
    t.dps(&n, &Tree::work1);
}

当然也可以用一个静态函数,然后多接受一个 Tree* 的参数,把 this 通过这个参数穿进去:

class Node{};
class Tree
{
public:
    Node * root;
    void dps(Node * t,void (*work)(Tree*, Node*)){
        work(this, t);
    };
    static void work1(Tree*t,Node*n){};
};
void foo() {
    Node n;
    Tree t;
    t.dps(&n, &Tree::work1);
}

面向对象概念,,,,,不能直接使用类/类定义,要使用类的实例。

推荐问题
宣传栏