2014-09-22 261 views
12

在實施創建/在屏幕上更新盒一類,我想添加一個靜態成員函數,可以確保當前沒有明顯的盒子重疊(以從靜態指針數組的信息給所有當前可見的框)爲什麼靜態成員函數只能在類定義中聲明爲靜態而不是在其自己的定義中聲明?

我的初始代碼具有下列結構:

class Box 
{ 
public: 
    // ... 
    static void arrangeOverlappingBoxes(); 
}; 

static void Box::arrangeOverlappingBoxes() 
{ 
    // ... 
} 

我很驚訝,這產生了錯誤C2724:「靜止」不應該在文件範圍定義的成員函數中使用。

有了一些嘗試,谷歌和錯誤,我想通了,我的函數定義應該失去關鍵字static,即應當

void Box::arrangeOverlappingBoxes() 
{ 
    // ... 
} 

但我不知道這背後的理由可能是什麼。它似乎是非常不對稱和令人困惑的,因爲它在類定義和它自己的定義中聲明瞭不同的函數頭。這有什麼理由嗎?

回答

7

您的類定義(在頭文件)將提供與任何propreties是必要的功能:

  • 靜態
  • 內聯
  • 虛擬

考慮到每一個進一步對象將使用.h來查看你的類定義,然後在這裏定義這些屬性是有意義的。此外,類中的每個函數都會考慮它在派生類中的屬性(例如,您需要僅在基類中聲明析構函數虛擬,每個後續繼承都將析構函數視爲虛函數)。

在實現主體中重新聲明這些屬性是沒有意義的。

必須在.h和.cpp文件中聲明函數屬性纔會導致分配問題。 想象一下這種情況:您在.h文件中將函數聲明爲虛函數,並在.cpp文件中聲明爲靜態函數。編譯器會做什麼功能?虛擬還是靜態? (或者更可能是編譯錯誤,但編譯器錯誤只會促使你在.cpp文件中匹配頭文件中的聲明,不能根據「static」或「virtual」)重載函數。

+0

謝謝你的回答,但我仍然沒有得到這一點。編譯器可以編程,只要屬性相同就可以編譯,就像參數應該是相等的(事實上,Java語法要求它是這樣的)。那麼,爲什麼你說這是沒有意義的?在我看來,它很有意義:如果你只是查看你的cpp文件(假設你的類定義在頭文件中),你會立即看到函數是靜態的,例如沒有這個指針而無需查看頭文件。 – 2014-09-23 08:08:05

+0

這樣想:如果您允許在.cpp和.h中指定函數的類型,會出現什麼問題?您將看到編譯器實際上會迫使您在.cpp中使用與頭文件中相同的屬性來實現該函數,否則您將得到無法解析的外部符號鏈接錯誤(請記住,所有外部類都與功能從標題)。因此,必須在cpp文件中聲明該屬性也是有意義的。C++足夠複雜,不需要額外的挑戰;)。 – MichaelCMS 2014-09-23 08:12:45

+0

關於您編輯的評論:您可以使用命名約定或評論來強調「靜態」或這些屬性。當涉及到方法類型時,我個人會在頭文件中查找(你需要去聲明並去定義)......也許這是一個風格問題 – MichaelCMS 2014-09-23 08:14:34

相關問題