1

我正在实现一个引用计数基类,并希望为每个正在创建的继承该接口的对象设置唯一编号。

这是该类的代码片段:

标题:

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

共产党:

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

我很怀疑这是否安全,如果不是,为什么不呢?由于两个原因,我没有使用 rand 和 srand 函数:

  1. srand AFAIK 最好在项目中仅使用一次以使随机数尽可能随机。
  2. 这种方法更精确,因为两个对象不能共享相同的内存位置。

请给我建议。

编辑:在什么时候创建成员 object_id?在构造函数内部或外部(在初始化列表之前或之后)嗯嗯?多谢!

4

2 回答 2

3

这不是一个安全的方法。您还没有考虑非虚拟多重继承。这很少见,但合法。

class A : public Object {};
class B : public Object {};
class C : public A, public B {}; // Now C has *two* IDs!
于 2012-01-01T17:58:01.323 回答
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(){}
    };

测试:

//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!

于 2012-01-02T12:10:29.197 回答