【问题标题】:Static object of class?类的静态对象?
【发布时间】:2012-09-22 01:16:40
【问题描述】:

我实际上并不知道您是否可以声明一个类,然后在同一类的多个对象中使用它的静态实例。更具体地说:

class State {
    public:
        State();
        static CustomNumberDist normal_dist;
    private:
        int id;   
};

所以每个 State 实例都应该包含同一个 CustomNumberDist 实例。我编译了,但我想知道它是否有效,否则我以后可能会遇到问题。

【问题讨论】:

  • 有效但不确定问题。
  • 没有State 的实例将包含 CustomNumberDist 的实例;将有一个与State 类关联的CustomNumberDist 实例。

标签: c++


【解决方案1】:

您给出的声明(头文件,即.h)完全有效。

但是在你需要的定义(.cpp 文件)中

State::CustomNumberDist normal_dist;

当您进入链接阶段时,静态对象将需要内存。

【讨论】:

    【解决方案2】:

    这是无效的。应该是这样的:

    class X
    {
    public:
          int normalValue = 5; //NSDMI
          static int i;
    };
    
    int X::i = 0;
    

    i 需要在内存中占有一席之地。在不涉及具体对象的内存中。

    更多信息可以在这里找到:

    Static Data Member Initialization

    【讨论】:

    • @delnan 在 OP 的代码中,normal_dist 没有被初始化。它只是被宣布。需要调用它的构造函数,而代码不会调用它。
    • “NSDMI”是什么意思?此外,您可能应该提到非静态成员的类内初始化(就像您对 normalValue 所做的那样)仅在 2011 年之后才有效;或者只是删除normalValue,因为它与问题无关。
    • @MikeSeymour 我猜他指的是“非静态数据成员初始化器”,但我不喜欢这种缩写一切的倾向。
    猜你喜欢
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    • 2011-09-07
    • 2012-02-14
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 2012-10-18
    相关资源
    最近更新 更多