указатель функции typedef, который принимает аргумент ClassName * перед определением ClassName? - PullRequest
0 голосов
/ 01 июля 2011

У меня следующая ситуация:

typedef void (*F_POINTER)(ClassName*);

class ClassName {
    public:
        F_POINTER f;
}

Это происходит потому, что экземпляр ClassName должен сам передать указатель клиенту.Однако, если я пишу вещи в таком порядке, я получаю жалобы на то, что ClassName не объявлено, и так далее.Однако, если я переключу их, я получаю жалобы на то, что F_POINTER не объявляется, когда я объявляю экземпляр в классе.

Так что, может быть, я здесь упускаю что-то простое, но как бы мне этого добиться?*

Ответы [ 4 ]

2 голосов
/ 01 июля 2011

Форвардная декларация:

class ClassName;

typedef (*F_POINTER)(ClassName*);

class ClassName {
    public:
        F_POINTER f;
}

или короче:

typedef (*F_POINTER)(class ClassName*); // implicit declaration;
1 голос
/ 01 июля 2011

Похоже, что это работает в соответствии с GCC 4.5.2 (mingw32):

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

int main ()
{
    F_POINTER x = f;
}

Я бы не стал доверять своей жизни, является ли она допустимой для C ++ или нет, даже для версии указателя, описанной другимилюди.Прямые объявления и указатели не решают все, например, невозможно объявить методы, которые выбрасывают указатели неполных типов, для этого нужно полное определение.Это может быть также незаконно, только что принято компиляторами.

0 голосов
/ 01 июля 2011

Либо вы можете объявить его как,

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;
};
0 голосов
/ 01 июля 2011

Форвард объявить ClassName. Тип может быть неполным, чтобы использовать указатель на него.

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

class ClassName { ... };

Или переместите typedef в класс. Также рассмотрите возможность использования boost::function / std::function вместо указателей на функции.

...