2011-07-01 23 views
0

我有以下情況:在定義ClassName之前需要參數ClassName *的typedef函數指針?

typedef void (*F_POINTER)(ClassName*); 

class ClassName { 
    public: 
     F_POINTER f; 
} 

這是因爲類名的實例都需要一個指針本身傳遞給客戶。但是,如果我按這個順序寫東西,我會抱怨ClassName沒有聲明,whatnot。但是,如果我切換它們,當我在類中聲明實例時,我得到了有關F_POINTER未被聲明的抱怨。

所以也許我在這裏錯過了一些簡單的東西,但是我會如何實現這一目標呢?

+1

「F_POINTER」的返回類型是什麼。 – iammilind

回答

2

向前聲明:

class ClassName; 

typedef (*F_POINTER)(ClassName*); 

class ClassName { 
    public: 
     F_POINTER f; 
} 

或更短:

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

簡單而重要。非常感謝你! – cemulate

0

正向聲明ClassName。使用指向它的類型可能不完整。

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

class ClassName { ... }; 

或者,將typedef移動到類中。另外考慮使用boost::function/std::function而不是函數指針。

0

要麼你可以在F_POINTER之前轉發聲明爲,

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

,或者您可以使用template辦法來避免這種hassels爲每class

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

Usage

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

這似乎是wor在GCC 4.5.2(mingw32的)王:

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

int main() 
{ 
    F_POINTER x = f; 
} 

我不相信它是否是由其他人所描述的法律C++或沒有,甚至沒有指針的版本我的生活。前向聲明和指針並不能解決所有問題,例如不可能聲明拋出不完整類型指針的方法,您需要完整的定義。這可能是非法的,只是被編譯器接受。

+0

即使在非指針的情況下,聲明不完整的類類型的函數參數也是完全合法的:上面對'F_POINTER'的定義是很好的。 –

相關問題