簡體   English   中英

forward聲明靜態函數c ++

[英]forward declare static function c++

我想在另一個文件中聲明一個類的靜態成員函數。 我想做的事情看起來像這樣:

BigMassiveHeader.h:

class foo
{
    static void init_foos();
}

Main.cpp的:

class foo;
void foo::init_foos();
int main(char** argv, int argc)
{
    foo::init_foos()
}

這失敗了“錯誤C2027:使用未定義類型'foo'”

有沒有辦法完成我想做的事情,使init_foos成為一個自由函數,或包括BigMassiveHeader.h? (BigMassiveHeader.h顯着影響編譯時間,並且包含在任何地方。)

您無法轉發聲明類的成員,無論它們是否為靜態。

你不能轉發聲明你的類的成員,但你可以在該命名空間內創建一個命名空間和一個函數,並轉發聲明它。

namespace nsfoo
{
     void init_foos();
}

如果需要,您的課程可以使用此功能。

如果你有一個BigMassiveHeader ,你應該考慮將它分成幾個SmallCompactHeaders 如果要表示許多類和函數在語義上屬於一起,則可以將它們放在同一名稱空間中。 您始終可以提供包含所有小標題的便捷標題。

不,您需要包含標題。 抱歉。

如果必須,請使用免費功能,或拆分課程。

你不能在C ++中部分地聲明類,所以要么你必須將類的聲明放在它自己的較小的頭中,要么......

在文件中包含BigMassiveHeader.h並使用預編譯頭文件。 Visual C ++方式: http//msdn.microsoft.com/en-us/library/2yzw0wyd%28v=VS.71%29.aspx ,或GCC方式: http//gcc.gnu.org/onlinedocs/ gcc / Precompiled-Headers.html

我知道這不是問題的關鍵,但如果BigMassiveHeader.h不太可能隨着時間的推移發生很大變化,那么你應該看看預編譯的頭文件

作為第一個重構,我使用一個調用靜態函數的自由函數。 這並不像你的主要方法被多次調用,所以你不會注意到額外的調用,這對現有代碼的改動最小。

當然,你實際上並沒有說出你想做什么,只是說你想做什么。 如果您要做的是在應用程序啟動時調用init_foos一次,請使用靜態對象初始化,而不是在main中調用它。 如果你要做的是在創建所有靜態對象后調用init_foos ,那么它就更復雜了。

通過靜態對象初始化,我的意思是在.cpp文件中有這樣的東西,它可以訪問init_foos的定義。 將其設為好友並將init_foos私有以防止多次通話:

struct call_init_foos {
  call_init_foos () { foo::init_foos(); }
} call_init_foos_on_startup;

要轉發類的單個方法的聲明,您必須將該方法聲明為該類的一部分(實際上是)。

例如,在您的情況下,添加到main.cpp:

class foo
{
public:
    static void init_foos();
}

它不是最漂亮的,但它會省去你必須包括整個標題..

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM