2016-11-05 54 views
1

的唯一ID我有一個這樣的類:類實例

class ExampleClass { 

private: 
    int _id; 
    string _data; 

public: 
    ExampleClass(const string &str) { 
     _data = str; 
    } 
    ~ExampleClass() { 

    } 
    //and so on...  

} 

如何添加唯一整數標識符(_id)爲類的每個實例,而不使用全局變量(!)?

+1

「你不能」是簡短的答案,除非你的'int'足夠寬以容納一個指針,並且你使用'this'中的醜陋演員。 –

+0

@SamVarshavchik,每個從'this'轉換爲int都是唯一的嗎? – kekyc

+1

只要'this'是唯一的,並且'int'足夠寬以容納一個整數,根據這個宇宙中的數學規則。 –

回答

2

使用私有靜態成員int,在類的所有實例中共享。 在構造函數中的static int中,只需增加它,並將其值保存到您的id成員中;

class ExampleClass { 

private: 
    int _id; 
    string _data; 
    static int counter=0; 
public: 
    ExampleClass(const string &str) { 
     _data = str; 
     id=++counter; 
    } 

更新:

您將需要採取在你的拷貝構造函數和operator =考慮你想要什麼樣的行爲(取決於您的需要,新的對象或一個相同)。

+0

「承包商」?哈哈...... :-) ...... PS:我不是downvoter,雖然 – WhiZTiM

+0

@WhiZTiM謝謝,但是答案很好。而且我是第一個 –

0

你可以隱藏你的類中的靜態數據,它將提供唯一的ID。

例子:

class ExampleClass { 

private: 
    int _id; 
    static int idProvider; 
public: 
    ExampleClass(const string &str) 
      : _id(++idProvider) 
    {} 
} 

int ExampleClass::idProvider = 0; 

是每次你創建的ExampleClass的對象,則增加idProvider這將然後分配一個唯一的ID邏輯您id

+0

我有這個想法,但問題是我不知道將有多大的數據集。當然,我可以希望_id足夠大,可以保留很長的數字... – kekyc

+0

@kekyc,然後使用'std :: uint64_t'(通常是一個'unsigned long long')......這將具有最大值關於'18446744073709551615' ...如果你的數據集比那個更大....那麼你可能想要全盤重新考慮你的設計......也許使用UUID? – WhiZTiM

+0

@WhiZTiM我最終決定把'this'這個指針強制轉換爲_id,因爲它在當前實例存在的時候是唯一的,而且它有一定的範圍,這取決於我的系統,所以我避免了原型中的類型溢出。 無論如何,謝謝你的回答! (如果你對這個'這個'解決方案有話要說,我想聽聽它。 – kekyc