用作常量的静态变量在其他类中返回零
Static variables used as constants return zero in other class
我有一个类,用于存储我正在创建的视觉实验的一些静态默认变量。
它们没有标记为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
包含在使用常量的文件中。程序启动时,常量将自动初始化。
相关文章:
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 让bool方法返回其他整数
- 为什么 c++ 中的 main() 函数不采用除 int 和 void 之外的任何其他返回类型
- 为什么重载运算符可以返回其返回类型以外的其他内容?
- Sizeof返回的是指针大小,而不是数组大小.有其他方法可以找到尺寸吗
- 在存储库中,筛选器函数返回动态向量或其他存储库
- SetWindowsHookEx 在挂接到其他线程时返回 NULL
- 如果创建支持返回可变参数类型列表的通用模板 API,我应该使用 std::tuple 还是其他东西?
- 如何根据枚举参数返回其他类型
- 当从其他方法返回 vector 时,C++无法访问矢量元素
- 如何在 CUDA 中的块中返回其他线程
- 如何将c 返回值列表或其他复杂类型的QML列表
- 在构造函数以外的任何其他位置访问相机时,我的相机指针返回 null
- 在参数包中获取函数指针的返回类型,并将其保存为与其他参数连接的元组
- C 使用功能定义中的if/其他语句以返回最小的数字
- 具有参考参数的函数不与其他函数返回的值一起工作
- 如何使用其他函数返回的值为结构体成员赋值
- 为什么主函数不识别其他功能是否返回float类型编号
- 从两个列之一返回值,或跳过数组中的所有其他元素
- Cuda 7.5和Visual Studio 2013:一些例子工作,但其他返回cudaErrorDevicesUnav