c++ - 通过 C++ 中的静态实例的单例——进入源文件或头文件?

标签 c++ singleton compiler-construction

干杯,

我在“Programming Game AI by Example”中遇到了这段代码:

/* ------------------ MyClass.h -------------------- */
#ifndef MY_SINGLETON
#define MY_SINGLETON

class MyClass
{
private:

  // member data
  int m_iNum;

  //constructor is private
  MyClass(){}

  //copy ctor and assignment should be private
  MyClass(const MyClass &);
  MyClass& operator=(const MyClass &);

public:

  //strictly speaking, the destructor of a singleton should be private but some
  //compilers have problems with this so I've left them as public in all the
  //examples in this book
  ~MyClass();

  //methods
  int GetVal()const{return m_iNum;}
  static MyClass* Instance();
};

#endif

/* -------------------- MyClass.cpp ------------------- */

//this must reside in the cpp file; otherwise, an instance will be created
//for every file in which the header is included
MyClass* MyClass::Instance()
{
  static MyClass instance;

  return &instance;
}

我对作者的事实声明感到困惑,即 header 中函数内的静态声明变量将导致声明多个单独的静态变量 instance。我不认为我在我经常将其放入 header 中的 getInstance() 函数的常用实现中看到过这种行为(除了我喜欢玩指针并在首次使用时初始化单例)。我在工作中使用 GCC。

那么标准是怎么说的呢?不兼容的编译器怎么说?作者的陈述是否正确?如果是这样,如果在 header 中声明了 getInstance(),您能说出一些会创建多个实例的编译器吗?

最佳答案

在 C++ 中,没有什么可以阻止内联函数拥有静态变量,并且编译器必须安排使该变量在所有翻译单元之间通用(就像它必须为模板实例化静态类成员和静态函数变量那样做)。 7.1.2/4

A static variable in an extern inline function always refer to the same object.

请注意,在 C 中,内联函数不能有静态变量(也不能引用具有内部链接的对象)。

关于c++ - 通过 C++ 中的静态实例的单例——进入源文件或头文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1389337/

相关文章:

c++ - QtQuick 2.1 从 TextInput 获取文本

c++ - C++ 中的未定义行为

c# - “密封类中的 protected 成员”警告(单例类)

c - Borland vs. MingW/GCC 编译速度..

C# 编译器数字文字

c++ - 如何在 Qt 中处理数据库连接?

c++ - 添加/EHa 到使用 Microsoft Visual C++ 编译器的 QtCreator

scala - 为什么 Scala 2.10 在匹配单例类型时给出 'match may not be exhaustive' 警告?

php - 在 PHP 中创建单例 Web 服务的最佳方法是什么?

c - 适用于 Windows 的最简单的 C 编译器和编辑器?