2012-12-07 26 views
0

我試圖避免聲明枚舉或使用字符串。雖然這樣做的理由看起來可疑,但完整的解釋並不重要。使用成員變量的地址作爲ID

我的問題很簡單。我可以使用成員變量的地址作爲唯一ID嗎?

更具體地,要求是:

  • 的ID將不必被序列化。
  • ID將被保護成員 - 只能由擁有對象在內部使用(即使在相同的類實例之間也沒有ID的比較)。
  • 子類需要訪問基類ID並可以添加它們的新ID。

所以第一個解決方案是這樣的:

class SomeClass 
{ 
    public: 
     int mBlacks; 

     void AddBlack(int aAge) 
     { 
      // Can &mBlacks be treated as a unique ID? 
      // Will this always work? 
      // Is void* the right type? 
      void *iId = &mBlacks; 

      // Do something with iId and aAge 
      // Like push a struct of both to a vector. 
     } 
}; 

雖然第二溶液是這樣的:

class SomeClass 
{ 
    public: 
     static int const *GetBlacksId() 
     { 
      static const int dummy = 0; 
      return &dummy; 
     } 

     void AddBlack(int aAge) 
     { 
      // Do something with GetBlacksId and aAge 
      // Like push a struct of both to a vector. 
     } 
}; 
+0

我可以看到使用SomeClass對象本身的地址,如果它是不可覆蓋的。但爲什麼你想在課堂上做到這一點呢? –

+2

只要您將複製構造函數和賦值運算符設爲私有,並且不要嘗試以任何方式對其進行序列化。在構造函數中增加一個簡單的靜態計數器將是更合理的選擇。 –

+0

因爲這個類中的所有代碼都是由一個宏生成的(而一個類可以實現多個這個宏)。實現枚舉的添加會更加複雜,我更喜歡比較內存地址和字符串。 – Izhaki

回答

2

此目的的任何其它int數據成員,和不同的無mBlacks構件SomeClass在同一進程中的實例,與SomeClass的此實例的mBlacks成員具有相同的地址。因此,您可以安全地將其用作流程中的唯一ID。

SomeClass空基類子對象可以有相同的地址mBlacks(如果SomeClass有任何空基類,它不),以及char對象是的mBlacks第一個字節具有相同的地址mBlacks 。除此之外,沒有其他對象具有相同的地址。

void*將作爲類型。 int*也可以工作,但也許你想爲不同的id使用不同類型的數據成員。

但是,該ID對於此實例是唯一的。相同類型的不同實例具有不同的ID。你的一個評論表明,這實際上並不是你想要的。

如果您希望類型的每個具有唯一的ID,並且對於具有相同ID的所有對象具有相同ID,那麼您最好從所有重要元素組成ID對象的字段。或者只是比較對象的平等而不是他們的ID,用合適的operator==operator!=

或者,如果你想要的ID唯一標識時,這個值是首先構建以外通過拷貝構造函數和拷貝賦值(以便都是同樣的「原始」共享一個身份證複印件所有對象),那麼這樣做的方法是在所有其他構造函數中分配一個新的唯一ID,將其存儲在數據成員中,並將其複製到複製構造函數和複製賦值運算符中。

獲得新ID的標準方法是每次獲取值時都增加一個全局計數器。這可能需要根據程序使用哪個類(以及它們如何使用它)來使線程安全。如果計數器的類型足夠大,那麼值在程序的給定運行中將是唯一的。

另一種方法是生成一個128位的隨機數。這在理論上並不令人滿意,但假設一個體面的隨機來源,碰撞的可能性不會大於你的程序因爲宇宙射線引起的數據損壞等一些不可避免的原因而失敗的機會。當對象源廣泛分佈時(例如,如果您需要在不同進程或不同機器上唯一的ID),隨機ID比順序ID更容易。您可以選擇使用機器的MAC地址,隨機數,時間,每個進程的全局計數器,PID和您想到的任何其他信息(或a standard UUID) 。但這可能是爲了你的需要矯枉過正。

[*]不一定是全局的 - 它可以是類的私有靜態數據成員,也可以是函數的靜態局部變量。

+0

我已更新我的問題。如果你能延續你的答案,那將會很棒。謝謝! – Izhaki