2016-01-21 101 views
0

我發現這個實施一個Singleton的。 我怎樣才能讓指針或共享的指針呢?`(共享)指針Singelton

而且這是爲什麼不工作? 自動測試=辛格爾頓::實例();

​​
+1

爲什麼在這種情況下你需要共享指針?這聽起來是你正試圖解決一個XY問題。測試代碼可以使用引用來修復:'auto&test = Singleton :: Instance();'。 –

回答

1

而且這是爲什麼不工作? auto test = Singleton :: Instance();

如果你看看編譯錯誤,它會告訴你。

main.cpp:31:37: error: use of deleted function 'Singleton::Singleton(const Singleton&)' 

您試圖複製對象。但複製構造函數被刪除,因此該類型不可複製。

你可能是爲了做一個參考,而不是一個副本:

auto& test = Singleton::Instance(); 

我怎樣才能讓一個指針......這樣做呢?

你可以把它的地址與運營商的地址的分配指針單:

auto* test = &Singleton::Instance(); 

或共享的指針

你不能有共同的指針有靜態存儲的對象 - 除非你使用特殊的刪除器,但這樣的共享指針幾乎沒有用處。由於你的單例有靜態存儲,所以你不想使用共享指針。您可以修改您的單例以將靜態存儲的共享指針保留爲動態分配的對象。然後你可以有一個共享指針。

+0

中聲明的私有成員,您將要給shared_ptr一個空刪除器 –

+0

啊 - 完美。合理。 非常感謝:) 這是一個單身人士的好方法嗎? – Waterplant

+0

用這種方法不可能手動刪除對象 - 對嗎?或者有什麼辦法? – Waterplant

0

爲什麼沒有共享指針作爲類的成員,並返回?

所以你必須

shared_ptr<Singleton> Instance() 
{ 
    if(!myInstance) 
    { 
     myInstance.reset(new Singleton()); 
    } 

    return myInstance; 
} 

private: 
    shared_ptr<Singleton> myInstance; 
+0

我試過了 - 但是我收到的消息是: 「無法訪問在類」 – Waterplant

0

原始指針:Singleton* ptr = &Singleton::Instance();auto ptr = &Singleton::Instance();

參考:Singleton& ref = Singleton::Instance();auto& ref = Singleton::Instance();

你不應該使用共享指針(因爲你沒有自己的單身目的)。不是沒有相應地改變單身人士班。


爲什麼yoour代碼沒有工作:auto演繹類型爲值類型,並試圖複製instance()結果。由於Singleton是無法複製的,因此失敗。