分配給的直接靜態數據成員需要定義。基本上定義分配內存。是這樣的:
class C
{
private:
static int i; // pure declaration
public:
static auto n_instances() -> int { return i; }
~C() { --i; }
C(){ ++i; }
C(C const&) { ++i; }
};
int C::i; // definition
在頭文件是不切實際的(如果報頭在多個翻譯單位使用這將是違反了一個定義規則,與鏈接器抱怨),這樣的話就可以使用以下技術:
class C
{
private:
static auto n()
-> int&
{
static int the_count = 0;
return the_count;
}
public:
static auto n_instances() -> int { return n(); }
~C() { --n(); }
C(){ ++n(); }
C(C const&) { ++n(); }
};
還有其他方法可以做到這一點,包括模板技巧和C++ 17個inline
數據。
我選擇使用int
,而不是unsigned
因爲int
有利於整數數字,而unsigned
是好位層次的東西,而不是相反。
聲明:代碼沒有被編譯器觸及。
只需在類聲明後添加'unsigned int C :: i = 0;'就可以工作了 –
另外,http://stackoverflow.com/questions/15845745/lnk2001-error-when-accessing-static-variables- c,http://stackoverflow.com/questions/16049306/error-lnk2001-unresolved-external-symbol-private-static-class和許多其他許多人。 – AnT