开发者

typedef function pointer that takes argument ClassName* before defining ClassName?

开发者 https://www.devze.com 2023-03-16 10:18 出处:网络
I have the following situation: typedef void (*F_POINTER)(ClassName*); class ClassName { public: F_POINTER f;

I have the following situation:

typedef void (*F_POINTER)(ClassName*);

class ClassName {
    public:
        F_POINTER f;
}

This happens because an instance of ClassName needs to pass a pointer itself to the client. However, If I write things in this order, I get complains about Cla开发者_StackOverflowssName not declared, whatnot. However, if I switch them around, I get complains about F_POINTER not being declared when I declare the instance in the class.

So maybe I'm missing something simple here, but how would I accomplish this?


Forward declaration:

class ClassName;

typedef (*F_POINTER)(ClassName*);

class ClassName {
    public:
        F_POINTER f;
}

Or shorter:

typedef (*F_POINTER)(class ClassName*); // implicit declaration;


This seems to be working under GCC 4.5.2 (mingw32):

typedef void (*F_POINTER)(class ClassName);
class ClassName {};
void f (ClassName) {}

int main ()
{
    F_POINTER x = f;
}

I wouldn't trust my life on whether it is legal C++ or not, not even the pointer version described by other people. Forward declarations and pointers do not solve everything, for example it is not possible to declare methods that throw pointers of incomplete types, you need full definition for that. This might be similarly illegal, just accepted by compilers.


Forward declare ClassName. The type can be incomplete to use a pointer to it.

class ClassName;
typedef (*F_POINTER)(ClassName*);

class ClassName { ... };

Alternatively, move the typedef inside the class. Also consider using boost::function/std::function instead of function pointers.


Either you can forward declare it as,

class ClassName;
typedef void (*F_POINTER)(ClassName*); // assume that return is `void`

before the F_POINTER or you can use the template trick to avoid such hassels for every class:

template<typename RETURN, typename ARGUMENT>
struct FuncPtr {  typedef RETURN (*F_POINTER)(ARGUMENT); };

Usage:

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

精彩评论

暂无评论...
验证码 换一张
取 消