[英]Check if instance exists and return reference in Singleton getInstance();
[英]why return type of getInstance method should be return by reference?
#include<iostream>
using namespace std;
class A{
private :
A()
{
cout<<"Constructed"<<endl;
}
~A()
{
cout<<"Destructed"<<endl;
}
public:
static A& getInstance()
{
static A a;
return a;
}
};
int main()
{
A::getInstance();
return 0;
}
為什么 getInstance 方法的返回類型應該通過引用返回?
如果 getInstance 方法的返回類型是按值返回,我會得到以下錯誤。
.\2.cpp: In function 'int main()':
.\2.cpp:25:20: error: 'A::~A()' is private within this context
25 | A::getInstance();
| ^
.\2.cpp:11:9: note: declared private here
11 | ~A()
| ^
為什么 getInstance 方法的返回類型應該通過引用返回?
因為析構函數是私有的,正如診斷消息所指出的那樣。 當析構函數是私有的時,不能在類的范圍之外創建臨時對象。 如果調用返回純右值的函數並丟棄該值,則會創建一個臨時對象。
您已將問題標記為 [singleton]。 單例是只有一個對象存在的類。 如果您的函數為每次調用返回一個新對象,則它不會是單例。
再補充幾點:
返回類型不一定是引用,但由於您返回的類的析構函數是私有的,任何返回該類型對象的函數(不是這個特定的函數)都不能返回實際對象。
這是因為調用者無法復制該對象。 當按值傳遞時,創建對象的副本並返回(對此有更多優化,但這是最簡單的想法)。 調用者然后在它超出范圍時銷毀該對象,如果它是私有的,則調用者不能。
關於返回引用的另一個快速說明,當您返回引用時,調用者不負責對象的生命周期。 如果在調用者完成之前銷毀返回的對象,則可能會導致對未初始化(銷毀)內存的訪問沖突。 在您的示例中,這是不可能的,因為返回的對象是一個靜態對象,它將一直存在到應用程序結束,所以如果這是您的意圖,這種模式很好,並且正如一些評論中提到的,它被稱為單例圖案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.