如何在c+;中使用非原始静态类变量来避免问题+;? 我已经读了很多关于C++中静态类变量初始化的内容,而谷歌编码标准只表示普通旧数据(即原语和指针)的静态,我在网上看到了很多例子,在书中作者违反了这个指南。
我还读到,只要将静态保存在单个编译单元中,就不太可能遇到未定义的初始化问题 好的…这么说吧…我想要一些专家的意见,看看我是否会遇到一些问题的道路上的代码看起来像如何在c+;中使用非原始静态类变量来避免问题+;? 我已经读了很多关于C++中静态类变量初始化的内容,而谷歌编码标准只表示普通旧数据(即原语和指针)的静态,我在网上看到了很多例子,在书中作者违反了这个指南。,c++,C++,我还读到,只要将静态保存在单个编译单元中,就不太可能遇到未定义的初始化问题 好的…这么说吧…我想要一些专家的意见,看看我是否会遇到一些问题的道路上的代码看起来像 //header file snippet struct TheStruct { string theString; string theString2; float theFloat; }; class TheClass { public: static const TheStruct Dude;
//header file snippet
struct TheStruct {
string theString;
string theString2;
float theFloat;
};
class TheClass {
public:
static const TheStruct Dude;
static const TheStruct Blah;
static const TheStruct TheStructArray[];
TheClass();
virtual ~TheClass();
TheStruct getCurrent();
private:
TheStruct current;
}
//impl file snippet
const TheStruct TheClass::Dude = { "Dude", "Dude", 0 };
const TheStruct TheClass::Blah = { "Blah", "Blah", 0 };
const TheStruct TheClass::TheStructArray[] = {TheClass::Dude, TheClass::Blah};
TheClass::TheClass() : current(TheClass::Dude) {}
TheClass::~TheClass() {}
TheStruct TheClass::getCurrent() {return current;}
我认为getCurrent()
方法可以。静态常量Dude
和Blah
被包装在一个静态数组结构数组中,以后的东西将使用它。但是,我猜如果数组被其他类使用,我仍然会有问题?例如,GUI可以使用该数组来显示有效的选项以供选择
我来自Java背景,所以我经常使用private static final
来定义一些有效的“状态”
谢谢
//impl file snippet
const TheStruct TheClass::Dude = { "Dude", "Dude", 0 };
const TheStruct TheClass::Blah = { "Blah", "Blah", 0 };
const TheStruct TheClass::TheStructArray[] = {TheClass::Dude, TheClass::Blah};
只要这三行是按这个顺序写的,代码就没有问题,因为它们是按前面提到的顺序初始化的,所以您不需要面对。否则,您应该仔细阅读您可能面临的问题以及您必须提供的内容。您可能会遇到问题
TheClass::TheClass() : current(TheClass::Dude) {}
当且仅当在代码中的不同cpp中声明了静态或全局类时。例如:
// somewhereelse.h
#include "TheClass.h"
class OtherClass {
static TheClass myTheClass;
}
// somewhereelse.cpp
TheClass OtherClass::myTheClass;
初始化“OtherClass::myTheClass”对象(调用构造函数并访问Class::Dude)可能发生在Class::Dude初始化其值之前。因此,在OtherClass::myTheClass的构造函数中可能会出现随机垃圾(或更严重的崩溃)
<>这可以通过使用不同复杂度(取决于您的要求)的C++单件模式来避免。
现在,无论类在其他地方如何使用,初始化都不会是未定义的。如果OtherClass有一个静态的TheClass对象,即使它是在任何其他对象之前初始化的,DudeStruct也会在“current”的复制构造函数中及时初始化。不要将Google编码标准作为良好编程实践的指南。@Nim这是真的,正如我所说,根据使用或需要,单例模式有多种形式。我试图解决初始化问题,而不是线程安全问题。
struct TheStruct {
string theString;
string theString2;
float theFloat;
};
class TheClass {
public:
static const TheStruct &Dude();
static const TheStruct &Blah();
static const TheStruct *TheStructArray();
TheClass();
virtual ~TheClass();
TheStruct getCurrent();
private:
TheStruct current;
};
//impl file snippet
const TheStruct &TheClass::Dude() {
static TheStruct DudeStruct = { "Dude", "Dude", 0 };
return DudeStruct;
}
const TheStruct &TheClass::Blah() {
static TheStruct BlahStruct = { "Blah", "Blah", 0 };
return BlahStruct;
}
const TheStruct *TheClass::TheStructArray() {
static TheStruct singletonStructArray[] = {TheClass::Dude(), TheClass::Blah()};
return singletonStructArray;
}
TheClass::TheClass() : current(TheClass::Dude()) {}
TheClass::~TheClass() {}
TheStruct TheClass::getCurrent() {return current;}