【问题标题】:Modifying static data member in class constructor [duplicate]在类构造函数中修改静态数据成员[重复]
【发布时间】:2016-10-02 06:12:09
【问题描述】:

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


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

这显示一个错误:
Main.obj : error LNK2001: unresolved external symbol "public: static unsigned char C::i" (?i@C@@2EA)

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

【问题讨论】:

标签: c++ class constructor static


【解决方案1】:

分配给的直接静态数据成员需要定义。基本上定义分配内存。是这样的:

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 适用于位级的东西,但反之则不然。

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

【讨论】:

  • 为什么是 auto 而不是更短更容易阅读的 static int& n() { static int n; return n; }
  • @Cheers:谢谢,这回答了我的问题,对许多类似情况很有帮助。
  • @6502:旧的函数声明语法非常有限的适用范围完全被新语法覆盖了。对同一件事使用两种语法是愚蠢的。我不同意可读性;相反,旧语法很糟糕。可读性,尤其是返回类型的模板表达式较长(还需要限定具有类范围的返回类型)。
猜你喜欢
  • 2013-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-11
相关资源
最近更新 更多