【问题标题】:Static variables used as constants return zero in other class用作常量的静态变量在其他类中返回零
【发布时间】:2011-10-01 03:47:17
【问题描述】:

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

它们没有被标记为 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和.cc文件的相关部分。
  • @Onedayitwillmake:您是否知道标记为static 的对象具有内部链接,因此您将在程序的每个翻译单元中获得一组不同的对象?如果您在一个翻译单元中调整它们,则不会影响其他翻译单元中副本的值。

标签: c++ static constructor


【解决方案1】:

这是因为当您在(例如 .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 = <>;

【讨论】:

  • 那么对于我想要实现的目标,什么可能是实现它的好方法。如果可能的话,我宁愿没有externs。
  • @user4683:你对externs有什么反对意见?
【解决方案2】:
// 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。常量会在程序启动时自动初始化。

【讨论】:

    猜你喜欢
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2012-12-04
    相关资源
    最近更新 更多