修改类构造函数中的静态数据成员

时间:2016-10-02 06:12:10

标签: c++ class constructor static

我试图通过修改静态数据成员来计算类的实例数:


class C
{
public:
    static unsigned int i;
    C(){i++;}
};

这表示错误:
Main.obj:错误LNK2001:未解析的外部符号" public:static unsigned char C :: i" (?我@ C_ @@ 2EA)

请通过编辑此代码以使其正常运行来帮助我,或者在不使用任何全局变量的情况下让我知道此问题的解决方案。
您的回答将不胜感激 谢谢。

1 个答案:

答案 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适用于位级东西,但反之亦然。

免责声明:编译器未触及的代码。