2012-09-26 101 views
0

這些方法之間是否有區別,除了首先返回一個對象,然後返回存儲myclass值的地址? 我在問,因爲我很少看到第一種方法,在很多來源,甚至像Aeonsoft這樣的大企業中,我總是看到方法2被使用。但有些程序員不喜歡&return,請賜教。單例方法之間的區別

static myclass& getinstance() 
{ 
    static myclass a; 
    return a; 
} 

static myclass* getinstance() 
{ 
    static myclass a; 
    return &a; 
} 

編輯 哦傢伙是我不好,我忘了&上的第一個方法

+5

關於你的編輯,我不明白爲什麼有人會在這種情況下使用指針。參考更明確;只要確保'myclass'是不可複製的。 –

+0

是的,我和你和其他人有相同的觀點,我不明白爲什麼第二種方法更多地被使用,正如我所說的,即使在大型企業的資料來源,也許我沒有看到足夠多的代碼? –

回答

4

第一個是沒有意義的,因爲它返回一個複製。後者有點愚蠢,因爲不需要指針。

的單身創建功能的常用方法是返回一個參考

static Foo & getFoo() 
{ 
    static Foo impl; 
    return impl; 
} 
+0

我只是忘了'&',請重新考慮一下 –

1

現在既然你已經糾正了第一種方法......

這只是一個風格問題哪一個是優選的。從C開始並轉移到C++的人可能會自然地使用指針,甚至不用考慮使用引用。


第一種方法實際上並不創建單例,因爲它返回該對象的 副本

一個簡單的微妙的變化可以解決這個問題:

static myclass & getinstance() 
{ 
    static myclass a; 
    return a; 
} 
+0

只是忘了寫'&',編輯了問題想法 –

+1

我不同意它純粹是一個風格問題。引用和指針有不同的語義,但它不可能是簡單的任意偏好。指針在這裏沒有預期的語義,所以參考更好。你正在*引用一個對象,而不是指向一個對象(一個指針是可爲空的引用)。 – GManNickG

+0

@GManNickG,指針和引用都可以完成工作,我不認爲語義差異值得擔心。我確實同意這個參考通常更合適,但是指針可以給你更多的靈活性。例如,您可以使用'getinstance'方法注入一個測試對象。我還遇到過混合庫和DLL導致創建多個單例的情況,修復了需要一個指針表的情況。 –

2

第一個API是更好的,因爲返回一個參考,而不是一個指針指示的對象將存在(即無需要測試NULL)。兩種方式都可以讓您返回多態對象(即myclass的子類),因此在那裏沒有區別。如果可以,您應該更喜歡返回參考。

+1

誰喜歡指針? –

1

在第一種情況下,您要返回a對象的副本。在第二個中,你正在返回一個指向它的指針。所以第一個函數將你的單例變成了一個多個 -ton。

我也修改第二個返回引用而不是指針。

static myclass& getinstance() 
{ 
    static myclass a; 
    return a; 
} 

編輯完成後,它看起來像是返回對第一個函數中的靜態對象的引用,而不是副本。在這種情況下,除了函數的調用者需要在第二種情況下取​​消引用指針外,沒有什麼區別。

作爲一個經驗法則,除非您希望能夠處理輸入/返回值,否則總是接受/返回參考。

1

傾向於通過參考返回。

這是因爲永遠不會有誰擁有對象的任何混淆。如果通過指針返回,用戶可能會錯誤地認爲他們需要刪除指針,因爲所有權語義不清晰。

相關問題