C ++单例和新运算符

时间:2016-08-05 19:29:48

标签: c++ class scope singleton

嗨我有一段代码片段是一个单例类(我相信),它以我以前从未见过的方式使用'new'和其他一些范围和静态限定符。因为我不知道它叫什么,我找不到任何关于它的作用或目的的信息。代码如下:

在myClass.h文件中我有

class myClass
{
private:
    static myClass sm_myClass;
    myClass();
public:
    static void Create(void);
};

在myClass.cpp中我有

#include "myClass.h"
#include <new>

myClass* p_myClass = NULL;

myClass myClass::sm_myClass;

myClass::myClass()
{
}

void myClass::Create(void)
{
    p_myClass = &sm_myClass;

    new (p_myClass) myClass();
}

我的问题是:

1 - .cpp文件的第6行(myClass myClass :: sm_myClass;)发生了什么

2 - .cpp文件的第16行(new(p_myClass)myClass();)发生了什么

3 - 以这种方式使用课程的总体目的是什么?

我真的希望这个问题不再重复。我搜索了一段时间的答案,但不知道甚至搜索的条件。谢谢你的帮助。

2 个答案:

答案 0 :(得分:4)

  

1 - .cpp文件的第6行(myClass myClass :: sm_myClass;)发生了什么

定义了静态类成员。

  

2 - .cpp文件的第16行(new(p_myClass)myClass();)发生了什么

指定展示位置新以重用为p_myClass分配的内存

  

3 - 以这种方式使用课程的总体目的是什么?

有些情况下单例可能派上用场,但一般情况下最好传递接口,而不是将客户端代码紧密耦合到myClass

不要使用new(展示位置new)来初始化单例实例。请改用 Scott Meyer的单例实现,以保证线程安全:

class myClass
{
private:
    myClass();
public:
    static myClass& instance() {
         static myClass theInstance;
         return theInstance;
    }
};

实例将在首次访问instance()函数时创建,并对任何后续调用保持不变。

答案 1 :(得分:3)

1)静态成员变量需要在一个编译单元(.cpp / .cxx)中分配存储空间。这个定义确立了这一点。

2)这称为placement new,它允许您将对象构造为已分配的内存。由于该对象已经构建并且正在覆盖构造,因此这种用法存在缺陷。

3)有时将一个全局服务封装到一个对象中并使单例为该服务的客户提供一种访问它的简单方法是很方便的。