初始化指向成员函数的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
}
答案 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。