typedef函数指针,在定义ClassName之前接受参数ClassName *?

时间:2011-07-01 03:34:21

标签: c++ syntax g++ function-pointers typedef

我有以下情况:

typedef void (*F_POINTER)(ClassName*);

class ClassName {
    public:
        F_POINTER f;
}

这是因为ClassName的实例需要将指针本身传递给客户端。但是,如果我按此顺序编写内容,我会抱怨没有声明ClassName,等等。但是,如果我切换它们,当我在类中声明实例时,我会抱怨没有声明F_POINTER。

所以也许我在这里错过了一些简单的东西,但我怎么能做到这一点?

4 个答案:

答案 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); };

Usage

class ClassName {
public:
  FuncPtr<void,ClassName*>::F_POINTER f;
};