2015-10-27 73 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;',這樣你的原始示例就不再編譯了。如果它可以被複制,它不是什麼單身,現在呢? –