我试图通过修改静态数据成员来计算类的实例数:
class C
{
public:
static unsigned int i;
C(){i++;}
};
这表示错误:
Main.obj:错误LNK2001:未解析的外部符号" public:static unsigned char C :: i" (?我@ C_ @@ 2EA)
请通过编辑此代码以使其正常运行来帮助我,或者在不使用任何全局变量的情况下让我知道此问题的解决方案。
您的回答将不胜感激
谢谢。
答案 0 :(得分:0)
分配给的直接静态数据成员需要定义。基本上,定义分配内存。是这样的:
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
适用于位级东西,但反之亦然。
免责声明:编译器未触及的代码。