typedef +指向成员函数的指针

时间:2017-07-14 10:36:23

标签: c++ function-pointers typedef

初始化指向成员函数的typedef-ed指针时出错。 是因为在类声明之前它是typedef-ed吗?如果是这样,我如何转发声明typedef,以便它可以在struct Definition中使用,然后在B类本身内部使用。

标题文件:

typedef void (B::* p)()

struct Definition {
   p code = nullptr;
    void execute() {
        code();
    }
}

class B
{

private:
    void semicolon();
    p o;
    void (B::* pointer)();
    std::list<Definition> definitions;
    void definePrimitives();
}

源文件:

void B::definePrimitives() {    
    o= B::semicolon;// error: expression must be a modifiable l-value   
    pointer =&B::semicolon;//works
}

2 个答案:

答案 0 :(得分:1)

这有效:

class B;
typedef void (B::* p)();

struct Definition {
    void execute() {
        p();
    }
};

class B
{

private:
    void semicolon();
    p o;
    void (B::* pointer)();
    std::list<Definition> definitions;
    void definePrimitives() {
        o= &B::semicolon;
        pointer =&B::semicolon;
    }
};

基本上你必须把指针指向函数,而不是函数本身

答案 1 :(得分:0)

代码有几个问题: 1)它缺乏IlBeldus指出的B类前瞻性声明。 如果删除B类的前向声明,您将能够重现该错误。 2)Definition struct里面的execute方法是错误的。它应该是:

  struct Definition {
    Code   code = nullptr;
    void execute(B b) {
        b.o = &B::semicolon;
        (b.*(b.c))();
    }
};

在我的实际应用程序中,我已将指向B的指针定义为Definition的成员。 一个人不能只通过

执行成员函数
p(); or code();

首先需要指定B类型的对象,如上例所示:

(b.*(b.c))();

3)第三,我的代码要求struct Definition 在 B下面声明 ,并且struct Definition 已经在B.之前被向前宣布:就像这样:

标题文件:

 #include <list>
class B;
using Code = void(B::*)(void);

struct Definition;

class B
{

private:

    void (B::* pointer)();
std::list<Definition> definitions;
    void definePrimitives();
public:
    void semicolon();
    Code o = nullptr;
    Code c = nullptr;
};

struct Definition {
    Code   code = nullptr;
    void execute(B b) {
        b.o = &B::semicolon;
        (b.*(b.c))();
    }
};

和源文件:

 #include "Header.h"
    #include <list>

    void B::semicolon()
    {
    }

    void B::definePrimitives() {
        o = &B::semicolon;
        pointer = &B::semicolon;
    }

    int main() {
        B b;
        return 0;
    }

4)和..在C ++世界中,我想要一直使用类而不是结构,并且因为我们已经过了c ++ 11,所以可能想要使用 using 子句,而不是typedef。