在實施創建/在屏幕上更新盒一類,我想添加一個靜態成員函數,可以確保當前沒有明顯的盒子重疊(以從靜態指針數組的信息給所有當前可見的框)爲什麼靜態成員函數只能在類定義中聲明爲靜態而不是在其自己的定義中聲明?
我的初始代碼具有下列結構:
class Box
{
public:
// ...
static void arrangeOverlappingBoxes();
};
static void Box::arrangeOverlappingBoxes()
{
// ...
}
我很驚訝,這產生了錯誤C2724:「靜止」不應該在文件範圍定義的成員函數中使用。
有了一些嘗試,谷歌和錯誤,我想通了,我的函數定義應該失去關鍵字static
,即應當
void Box::arrangeOverlappingBoxes()
{
// ...
}
但我不知道這背後的理由可能是什麼。它似乎是非常不對稱和令人困惑的,因爲它在類定義和它自己的定義中聲明瞭不同的函數頭。這有什麼理由嗎?
謝謝你的回答,但我仍然沒有得到這一點。編譯器可以編程,只要屬性相同就可以編譯,就像參數應該是相等的(事實上,Java語法要求它是這樣的)。那麼,爲什麼你說這是沒有意義的?在我看來,它很有意義:如果你只是查看你的cpp文件(假設你的類定義在頭文件中),你會立即看到函數是靜態的,例如沒有這個指針而無需查看頭文件。 – 2014-09-23 08:08:05
這樣想:如果您允許在.cpp和.h中指定函數的類型,會出現什麼問題?您將看到編譯器實際上會迫使您在.cpp中使用與頭文件中相同的屬性來實現該函數,否則您將得到無法解析的外部符號鏈接錯誤(請記住,所有外部類都與功能從標題)。因此,必須在cpp文件中聲明該屬性也是有意義的。C++足夠複雜,不需要額外的挑戰;)。 – MichaelCMS 2014-09-23 08:12:45
關於您編輯的評論:您可以使用命名約定或評論來強調「靜態」或這些屬性。當涉及到方法類型時,我個人會在頭文件中查找(你需要去聲明並去定義)......也許這是一個風格問題 – MichaelCMS 2014-09-23 08:14:34