如何正确创建单例对象并在C ++中使用它?

时间:2014-10-19 08:36:17

标签: c++ singleton

背景

我对OOP的大部分经验来自Objective-C。在该语言中,实例方法之间存在明显的区别。因此,使用单例非常容易,没有任何副作用。

C++我没有那么幸运,我似乎无法避免被我控制的对象。

代码

我有以下对象

class Window
{
private:
    Window();
    Window(Window const &windowCopy);
    void operator=(Window const &windowRight);

public:
    ~Window();
    static Window getSingleton();
};

这是.h。大部分实现只是我使用cout在调用.h中的每个方法时打印消息。除了getSingleton()方法。

Window Window::getSingleton()
{
    static Window singleton;
    return singleton;
}

这是我的主要

int main(int argc, char *argv[])
{
    Window::getSingleton();
    Window::getSingleton();

    std::cout << "Stack is being removed" << std::endl;

    return 0;
}

结果

运行后,我得到以下输出

Window created   -> 0x10c9bf0e0 // This is the static singleton
Window copied    -> 0x7fff53242bb8 <- from 0x10c9bf0e0 // What is this?
Window destroyed -> 0x7fff53242bb8 // And what is it's scope?
Window copied    -> 0x7fff53242bb0 <- from 0x10c9bf0e0
Window destroyed -> 0x7fff53242bb0
Stack is being removed
Window destroyed -> 0x10c9bf0e0

问题

出于某种原因,每当我调用我的单例方法时,都会出现一个新对象,并将单例分配给自己。为什么?我如何更改此设置,以便在整个应用期间只有一个 Window对象?

1 个答案:

答案 0 :(得分:5)

您通过值

传递对象
Window Window::getSingleton()
{
    static Window singleton;
    return singleton;
}

你应该通过引用(或指向它)的方式返回它

Window& Window::getSingleton()
{
    static Window singleton;
    return singleton;
}

这通常是预期的行为of the singleton pattern