Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在c+;中使用非原始静态类变量来避免问题+;? 我已经读了很多关于C++中静态类变量初始化的内容,而谷歌编码标准只表示普通旧数据(即原语和指针)的静态,我在网上看到了很多例子,在书中作者违反了这个指南。_C++ - Fatal编程技术网

如何在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;}