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

Static variables used as constants return zero in other class

本文关键字:其他 返回 变量 常量 静态      更新时间:2023-10-16

我有一个类,用于存储我正在创建的视觉实验的一些静态默认变量。

它们没有标记为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;
}

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

// 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 
    };

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

其他方法是将它们封装在class而不是namespace:中

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

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

int Forces::MAX_LIFETIME = <>;
// 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包含在使用常量的文件中。程序启动时,常量将自动初始化。