我有以下情况:
typedef void (*F_POINTER)(ClassName*);
class ClassName {
public:
F_POINTER f;
}
这是因为ClassName的实例需要将指针本身传递给客户端。但是,如果我按此顺序编写内容,我会抱怨没有声明ClassName,等等。但是,如果我切换它们,当我在类中声明实例时,我会抱怨没有声明F_POINTER。
所以也许我在这里错过了一些简单的东西,但我怎么能做到这一点?
答案 0 :(得分:2)
转发声明:
class ClassName;
typedef (*F_POINTER)(ClassName*);
class ClassName {
public:
F_POINTER f;
}
或更短:
typedef (*F_POINTER)(class ClassName*); // implicit declaration;
答案 1 :(得分:1)
这似乎在GCC 4.5.2(mingw32)下工作:
typedef void (*F_POINTER)(class ClassName);
class ClassName {};
void f (ClassName) {}
int main ()
{
F_POINTER x = f;
}
我不相信我的生活是否是合法的C ++,甚至不是其他人描述的指针版本。前向声明和指针并不能解决所有问题,例如,无法声明抛出不完整类型指针的方法,您需要完全定义。这可能同样是非法的,只是被编译器接受。
答案 2 :(得分:0)
转发声明ClassName
。使用指向它的指针可能不完整。
class ClassName;
typedef (*F_POINTER)(ClassName*);
class ClassName { ... };
或者,移动班级中的typedef
。另请考虑使用boost::function
/ std::function
而不是函数指针。
答案 3 :(得分:0)
要么你可以将其声明为,
class ClassName;
typedef void (*F_POINTER)(ClassName*); // assume that return is `void`
在F_POINTER
之前,或者您可以使用template
技巧来避免每个class
使用此类词条:
template<typename RETURN, typename ARGUMENT>
struct FuncPtr { typedef RETURN (*F_POINTER)(ARGUMENT); };
class ClassName {
public:
FuncPtr<void,ClassName*>::F_POINTER f;
};