用作常量的静态变量在其他类中返回零

时间:2011-10-01 03:47:18

标签: c++ static constructor

我正在使用一个类来存储我正在创建的可视化实验的一些静态默认变量。

它们没有标记为const,因为我使用GUI在运行时调整它们。 当我在主类(它在Defaults类中调用静态函数init)中记录它们时 - 它们是有效的。但是在不同类的构造函数中,它返回零。

输出看起来像这样

"Constants::init() called" // Constants::Heads::MIN_LIFETIME initialized to 1200
preSetup-Log  Constants::Heads::MIN_LIFETIME 1200
PhysicsObject- Constants::Heads::MIN_LIFETIME 0 // Y you zero?
postSetup-Log  Constants::Heads::MIN_LIFETIME 1200

我正在定义这样的常量:

namespace Constants {
    namespace Forces {
        static int MAX_LIFETIME;
        static float GRAVITY_FORCE;
    };
}


static void init() {
    std::cout << "Constants::init()" << std::endl;
    Constants::Forces::GRAVITY_FORCE = 40000.0f;
    Constants::Forces::MAX_LIFETIME = 3000;
}

2 个答案:

答案 0 :(得分:4)

这是因为当您在一个(例如static)文件中声明变量.h并将该文件包含在各种.cpp文件中时,那么每个.cpp文件(翻译) unit),创建变量的单独副本。例如,

// x.h ...
    namespace Forces {
        static int MAX_LIFETIME;  // unique copy for each translation unit (.cpp)
        static float GRAVITY_FORCE;  // same as above

        extern int SOMETHING; //<----- creates only single copy 
    };

如图所示,您应该在extern中将变量创建为 namespace ,并仅在.cpp个文件中定义该变量。

其他方式是将它们放在class而不是namespace中:

class Forces {
    static int MAX_LIFETIME;  // only 1 copy
    static float GRAVITY_FORCE;  // only 1 copy
};

您仍然需要在其中一个.cpp文件中定义它们,

int Forces::MAX_LIFETIME = <>;

答案 1 :(得分:3)

// header.h
namespace Constants {
    namespace Forces {
    extern int MAX_LIFETIME;
    extern float GRAVITY_FORCE;
    }
}

// my_constants.cpp
namespace Constants {
    namespace Forces {
        int MAX_LIFETIME = 3000;
        float GRAVITY_FORCE = 40000.0f;
     }
}

然后在使用常量的文件中包含header.h。程序启动时,常量会自动初始化。