仅用于第一个实例的 C++ 构造函数?
C++ Constructor for first instance only?
所以我有一个带有静态变量的class,它们是静态的原因是(虽然它看起来微不足道)效率(只需要加载一次,减少相同内存中的存储冗余文件)。
无论如何我想知道的是,有没有办法检查变量是否已加载?
或者有没有办法在第一次创建此 class 的实例时调用特定的构造函数,并在存在其他实例时使用另一个构造函数?
如果这些都不合适,解决方案是什么?
给你:
class Test {
static bool isInitialized;
public:
Test() {
if (!isInitialized) {
// do whatever you need here
// ...
isInitialized = true;
}
}
};
bool Test::isInitialized = false;
如果您的静态成员是私有的,并且在与所有 class 的成员函数相同的翻译单元中初始化,那么标准保证静态成员在使用之前将被初始化。参见:When are static C++ class members initialized?
在其他情况下此保证对您没有帮助(例如,从另一个翻译单元或从内联成员函数访问非私有静态成员)。
您可以玩带有 isInitialized
标志的游戏,但请注意,如果不做进一步的工作,这不是线程安全的。
C++ 常见问题解答建议将静态 class 实例包装在函数中,这可确保它们在首次使用时被初始化。例如:
Fred& x()
{
static Fred* ans = new Fred();
return *ans;
}
来源:https://isocpp.org/wiki/faq/ctors#static-init-order-on-first-use
您可以这样做:
struct StaticData
{
// some variables
};
class YourClass
{
public:
YourClass(/*..*/) {
if (staticData == nullptr) {
staticData = std::make_unique<StaticData>(/*..*/)
}
}
private:
static std::unique_ptr<StaticData> staticData;
};
static std::unique_ptr<StaticData> YourClass::staticData;
所以我有一个带有静态变量的class,它们是静态的原因是(虽然它看起来微不足道)效率(只需要加载一次,减少相同内存中的存储冗余文件)。
无论如何我想知道的是,有没有办法检查变量是否已加载?
或者有没有办法在第一次创建此 class 的实例时调用特定的构造函数,并在存在其他实例时使用另一个构造函数?
如果这些都不合适,解决方案是什么?
给你:
class Test {
static bool isInitialized;
public:
Test() {
if (!isInitialized) {
// do whatever you need here
// ...
isInitialized = true;
}
}
};
bool Test::isInitialized = false;
如果您的静态成员是私有的,并且在与所有 class 的成员函数相同的翻译单元中初始化,那么标准保证静态成员在使用之前将被初始化。参见:When are static C++ class members initialized?
在其他情况下此保证对您没有帮助(例如,从另一个翻译单元或从内联成员函数访问非私有静态成员)。
您可以玩带有 isInitialized
标志的游戏,但请注意,如果不做进一步的工作,这不是线程安全的。
C++ 常见问题解答建议将静态 class 实例包装在函数中,这可确保它们在首次使用时被初始化。例如:
Fred& x()
{
static Fred* ans = new Fred();
return *ans;
}
来源:https://isocpp.org/wiki/faq/ctors#static-init-order-on-first-use
您可以这样做:
struct StaticData
{
// some variables
};
class YourClass
{
public:
YourClass(/*..*/) {
if (staticData == nullptr) {
staticData = std::make_unique<StaticData>(/*..*/)
}
}
private:
static std::unique_ptr<StaticData> staticData;
};
static std::unique_ptr<StaticData> YourClass::staticData;