2015-10-27 44 views
1
#include <iostream> 
#include <memory> 

using namespace std; 

class Demo { 
    static shared_ptr<Demo> d; 
    Demo(){} 
public:  
    static shared_ptr<Demo> getInstance(){ 
     if(!d) 
     d.reset(new Demo); 
     return d; 
    } 
    ~Demo(){ 
     cout << "Object Destroyed " << endl; 
    } 

}; 

// shared_ptr<Demo> Demo::d(new Demo); // private ctor is accepted 

shared_ptr<Demo> Demo::d; 

int main() 
{ 
    shared_ptr<Demo> d(Demo::getInstance()); 
    cout << d.use_count() << endl; 

    return 0; 
} 
  1. 这是使用的shared_ptr实现单例类
  2. 请参见上面的注释行来初始化静态的shared_ptr怎么来的,我们可以创建一个对象在这里与初始化shared_ptr的正确方法私有构造
+1

单身更是一种反模式,所以我建议不要实施它们。它们与全局变量没有什么不同。 – Jens

+1

虽然很多人都认为单身使用不明智可能会造成问题,但我认为在这里批评它们并不是特别有用 - 它不会帮助提问者解决问题。 –

回答

6

这不是线程安全的:调用getInstance的两个线程将导致数据竞争。一种常见的方法是使用一个函数作用域的静态变量:

static shared_ptr<Demo> getInstance(){ 
    static shared_ptr<Demo> d(new Demo); 
    return d; 
} 

这种可变是保证准确地一旦被初始化,当控制越过其首次定义,并且在线程安全的方式。

在这一点上,虽然它不完全清楚你为什么想要使用shared_ptr。你也可以做

static Demo& getInstance(){ 
    static Demo d; 
    return d; 
} 

这是一个单身人士(好,其中之一)的教科书实施。


回复:用私有构造函数初始化。我不确定我了解你的困惑的本质。你问为什么Demo::getInstance可以使用Demo的私人构造函数?那么,因为它是Demo的成员,并且类的成员可以访问该类的私有成员。你问为什么Demo::getInstance可以调用shared_ptr<Demo>::reset()传递Demo*指针?那么,因为reset()shared_ptr的公共成员函数,将一个指针作为参数。这个过程的哪一部分你有争议?

+0

getInstance()的静态变量不起作用,我认为 –

+0

不以什么方式工作?是什么让你这么想的? –

1

我的第2个以上的问题是,怎么来的叫了一声类的侧私有构造在实例静态成员

// shared_ptr<Demo> Demo::d(new Demo); // private ctor is accepted 

我想回报局部静态无法正常工作,请参见下面销毁两次

#include <iostream> 

using namespace std; 

class Demo { 
public: 
    static Demo & getInstance(){ 
     static Demo d; 
     return d; 
    } 
    ~Demo(){ 
     cout << "Demo destroyed" << endl; 
    } 
}; 

void fun(){ 
    Demo l = Demo::getInstance(); 

} 
int main() 
{ 
    fun(); 
    cout << "Hello World" << endl; 
} 
示例对象
+0

你知道在执行'Demo l = Demo :: getInstance();'后,你最终会得到一个单身的副本,因此你不会再有单身人士了吗? – Jens

+1

使它成为'Demo&l = Demo :: getInstance();'(注意&符号)。然后标记'Demo'的拷贝构造函数被删除,如'Demo(const Demo&)= delete;',这样你的原始示例就不再编译了。如果它可以被复制,它不是什么单身,现在呢? –