2012-01-01 87 views
1

我正在實現一個引用計數基類,並希望爲正在創建的每個繼承該接口的對象設置唯一編號。選擇對象ID的隨機數?

這裏是從該類的代碼片段:

部首:

class Object 
    { 
     const long long int object_id; 
    public: 
     Object(); 
     virtual ~Object(); 
    }; 

CPP:

Object::Object() : object_id(reinterpret_cast<long long int>(&object_id)) 
    { 
    } 

我corious如果這是安全的方法還是不行,如果不是,爲什麼不? 我沒有使用RAND和srand函數,因爲2個原因:

  1. 函數srand據我所知,最好只使用一次的項目,使隨機數儘可能隨機的。
  2. 這種方法更精確,因爲兩個對象不能共享相同的內存位置。

請指教我。

編輯: 在什麼時候創建成員object_id?在構造函數內部或外部(在初始化列表之前或之後)hm hm? 非常感謝!

+1

如何使用良好的舊GUID? – 2012-01-01 17:47:23

+2

你可以使用對象實例指針作爲ID嗎?這個問題很難回答,因爲它取決於你需要的ID,在複製,序列化,生存期等方面必須遵循什麼樣的行爲 – tenfour 2012-01-01 17:48:36

+0

謝謝,如何在C++中使用GUID? – codekiddy 2012-01-01 17:49:11

回答

3

這不是一種安全的方法。您沒有考慮非虛擬多重繼承。這很少見,但合法。

class A : public Object {}; 
class B : public Object {}; 
class C : public A, public B {}; // Now C has *two* IDs! 
+1

這取決於你的「安全」的定義。有兩個對象,所以有兩個ID。 – 2012-01-01 17:59:34

+0

哇,很好的地方。我沒有想到:/那麼你在這種情況下推薦什麼東西,通過爲特定對象拼出唯一的ID?謝謝 – codekiddy 2012-01-01 18:02:42

+1

@codekiddy:簡單:不要。 – Puppy 2012-01-01 18:03:48

1

好的,這是我第一次回答我自己的問題,但這是我做unique_id工作。

//this is base class which only hold the id and may be inherited only by Object class 
struct object_id 
{ 
//friend class Object; 
//protected: MAKE IT PUBLIC FOR TESTING PURPOSES! FOR NOW 
    int id; 
    object_id() : id(reinterpret_cast<int>(&id)) { } //id will be 100% uniqe 
}; 

//this class inherits virtualy so the id member will be in each derived class only once! 
class Object : virtual public object_id //INHERIT PRIVATE LATER, now it's public for testing! 
{ 
public: 
    Object(){} 
    virtual ~Object(){} 
    }; 

TEST:

//now let's make some diamod inheritance to se if it work:) 

class a: public Object{}; 
class b: public Object{}; 
class c: public a,b{}; 

//now let's test it: 

int main() 
{ 
    c obj; 
    c ss; 
    c dd; 
    cout << endl << obj.id << endl << ss.id << endl << dd.id << endl; 
    cin.ignore(); 
    return 0; 
} 

這只是正常和每一個對象現在有它自己獨特的ID!