2015-04-07 125 views
2

我需要在我的頭文件以前瞻聲明一個類,像這樣:爲什麼我不能轉發聲明靜態函數?

class MyStaticClass; 

我明白,爲什麼不能向前聲明這個類的數據成員。我曾經認爲你可以向前聲明函數。我想聲明這個類的靜態函數,就像這樣:

class MyStaticClass; 
static int MyStaticClass::AddTwoNumbers(const int a, const int b); 

這雖然給了我一個編譯錯誤:

error C2027: use of undefined type 'MyStaticClass' 

爲什麼這個不能做?或者有沒有祕密的方式來做到這一點?

+0

爲什麼?您不需要提供類成員函數的前向聲明。在使用它之前,您只需確保類定義在範圍內。 – EJP

+0

在我正在開發的項目中,出於某些原因,我不能簡單地包含我需要的文件頭。因此,我想只是向前聲明它,並且鏈接器將它鏈接起來。 – Yellow

+0

爲了能夠說'SomeType :: Anything',你需要一個完整的定義'SomeType'。 – juanchopanza

回答

3

這是不允許的,因爲它允許其他人將成員函數添加到類中,而無需編輯類本身。

考慮這一點,

struct X 
{ 
    static void f(float a) { std::cout << a << std::endl; } 
private: 
    static int _data; //inaccessible to non-member 
}; 

X::f(0); //convert 0 (an int) to float, and call X::f(). 

現在想象一下,有人來了,只是包括頭定義了上述類之前前瞻性聲明下面的函數,:

static void X::f(int); 

現在前面的調用X::f(0)會給鏈接器錯誤(未解決的名稱),因爲現在0不會轉換爲float,因爲它不需要,因爲有聲明函數接受int,雖然沒有定義—更糟,如果它被定義,那麼你甚至不會得到鏈接器錯誤,你可能不會輕易知道一個不同的函數被調用。

Morever。 f(int)現在可以通過這種方式訪問​​private成員_data以及—,任何人都可以通過隨意添加功能來訪問任何私有/受保護成員。

相關問題