我对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
对象?
答案 0 :(得分:5)
您通过值
传递对象Window Window::getSingleton()
{
static Window singleton;
return singleton;
}
你应该通过引用(或指向它)的方式返回它
Window& Window::getSingleton()
{
static Window singleton;
return singleton;
}
这通常是预期的行为of the singleton pattern。