是否可以在 C++ 中的 class 的静态方法中初始化静态成员?
Is it possible to initialise a static member in a static method of a class in C++?
所以我有静态成员 precision
和一个 public 静态方法来在我的 class 中设置它的值(下面的代码被精简了很多)。
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
(运行 on onlinegdb.com).
主要代码中的确切代码:
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
时初始化。
我还尝试对存储指向所有实例的指针的向量执行此操作,而不必编写代码以在 class/in .cpp
文件之外进行初始化。
是否可以在 main
函数之前在 .cpp
文件中初始化(存储实例指针的向量和存储当前精度的无符号短整数) ?
更新代码:
#include <iostream>
using namespace std;
class Foo {
private:
typedef unsigned short precision_t;
static inline precision_t precision;
//static precision_t precision; //when not using static inline
public:
static void set_precision(precision_t value) {
//precision_t precision = value; //<<-- error in your code
precision = value;
/* other stuff */
}
static precision_t get_precision() {
return precision;
}
};
//Foo::precision_t Foo::precision = 0; //when not using static inline
int 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
return 0;
}
所以我有静态成员 precision
和一个 public 静态方法来在我的 class 中设置它的值(下面的代码被精简了很多)。
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
(运行 on onlinegdb.com).
主要代码中的确切代码:
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
时初始化。
我还尝试对存储指向所有实例的指针的向量执行此操作,而不必编写代码以在 class/in .cpp
文件之外进行初始化。
是否可以在 main
函数之前在 .cpp
文件中初始化(存储实例指针的向量和存储当前精度的无符号短整数) ?
更新代码:
#include <iostream>
using namespace std;
class Foo {
private:
typedef unsigned short precision_t;
static inline precision_t precision;
//static precision_t precision; //when not using static inline
public:
static void set_precision(precision_t value) {
//precision_t precision = value; //<<-- error in your code
precision = value;
/* other stuff */
}
static precision_t get_precision() {
return precision;
}
};
//Foo::precision_t Foo::precision = 0; //when not using static inline
int 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
return 0;
}