2011-01-06 45 views
2

所以,我找到了不同的方法來實現單例的「創建」。
編輯:當我說「創造」,我的意思是。這段代碼當然會放在Singleton :: {ctor}或靜態Singleton :: Init()函數中。Singleton實現之間的區別

//v1 
     //the first "1" is casted to a pointer to Ty, then that pointer is casted 
     //back to int to obtain the hex address 
     //the second 1 is casted to a pointer to Ty, then to a pointer 
     //to cSingleton<Ty> because Ty is a derived class and finally 
     //back to int to get the hex address 
     //after that it's simple pointer arithmetics to get the offset 
     int offset = (int)(Ty*)1 - (int)(cSingleton <Ty>*)(Ty*)1; 
     m_pSingleton = (Ty*)((int)this + offset); 
//v2 
     m_pSingleton = static_cast<Ty*>(this); 
//v3 
     m_pSingleton = (Ty*)this; 

它們之間有任何顯着差異嗎?
據我所知,v2和v3應該是相同的,但它的v1我不是很瞭解。我知道它做了什麼,但是爲了什麼目的?

另外,請不要把它變成「Singletons are BAAAAD」的討論。

+3

WTH是嗎?看起來像參加這個比賽:www.ioccc.org/main.html – 2011-01-06 08:31:37

+1

um。你可以通過靜態指針指向類來創建一個單例,然後創建一個靜態工廠函數來創建這個類,或者返回現有的指針。我不知道這段代碼在做什麼,除了很多不必要和危險的演員。 – 2011-01-06 08:32:16

+0

@Xeo nice gravatar – abel 2011-01-06 08:36:34

回答

2

(因爲這個問題似乎已經死了,我會盡力回答對我自己。)
什麼v1所做的是手動調節this指針指向派生類對象的地址。通常,static_cast或普通的c風格轉換本身就是這樣做的,但在早期的編譯器中可能並非如此,或者存在錯誤。以往的情況是,它會演員扮演什麼角色。

1

v2和v3幾乎相同,但v3使用的是C風格的轉換(C++風格的轉換更安全,因爲在編譯時會得到更多的檢查)。

V1是...哇...以下是它在做什麼:

  • 投數1Ty類型的指針,並返回到int。我預計這仍然會產生1
  • 將數字1轉換爲我的類型Ty的指針,將其轉換爲指針cSingleton<Ty>,最後返回int。我預計這仍然是1
  • 減去兩者。我希望它可以爲0。
  • 在v2和v3設置單到this一樣,但調整爲「偏移」

我猜有某處建築的一些怪癖,其中的結果鑄造1會導致您獲得非1結果,所以偏移量將不爲零。因此,這將是一種調整平臺上的怪癖的方法。

這是一個猜測,但我希望會有一些意見來解釋代碼(但可能不會)。也許有人可以用比我更具體的答案作爲參考,但希望這可以讓你繼續下去。

0

Here是一個不錯的單例C++示例。我不知道你爲什麼使用這種編碼,這不是好的做法。

相關問題