[英]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.