【发布时间】:2020-08-05 22:48:02
【问题描述】:
所以我有一个静态成员 precision 和一个公共静态方法来在我的类中设置它的值(下面的代码被精简了很多)。
class Foo {
private:
typedef unsigned short precision_t;
static precision_t precision;
public:
static void set_precision(precision_t value) {
precision_t precision = value;
/* other stuff */
}
static precision_t get_precision() {
return precision;
}
};
当我创建一个实例然后设置值时,它似乎工作正常,但尝试获取该值会产生一个略显神秘的错误:main.cpp:(.text._ZN3Foo13get_precisionEv[_ZN3Foo13get_precisionEv]+0x7): undefined reference to `Foo::precision' collect2: error: ld returned 1 exit status(在 onlinegdb.com 上运行)。
main 中的确切代码:
Foo *foo = new Foo(); //fine
foo->set_precision(5); //no error, but probably wrong given undefined reference
std::cout << Foo::get_precision(); //shows above error
set_precision 的原始代码看起来更像
static void set_precision(precision_t value) {
static bool defined = false;
if (defined) {
precision = value
} else {
precision_t precision = value;
defined = true;
}
/* other stuff */
}
所以它只会在第一次初始化precision。
我还尝试对存储指向所有实例的指针的向量执行此操作,而不必编写代码以在类外部/.cpp 文件中进行初始化。
甚至有可能这样做还是我必须在.cpp 文件中在main 函数之前初始化(存储实例指针的向量和存储当前精度的无符号短整型)?
【问题讨论】:
-
所有
static成员should be defined 在程序中只出现一次。您可以将其视为编译器的“为该对象分配静态内存的位置”-ish 指令。或者只使用static inline -
另外,
set_precision中的precision_t precision = value;设置了一个本地 变量,而不是同名的静态成员变量。
标签: c++ initialization declaration static-methods static-members