2012-01-01 2 views
1

Я реализую базовый класс подсчета ссылок и хотел бы установить число uniqe для каждого создаваемого объекта, который наследует этот интерфейс.Выбор случайного числа для ID объекта?

вот фрагмент кода из этого класса:

HEADER:

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, если это безопасный подход или нет, если нет, то почему ? я не использовал ранды и srand функцию из-за 2 причин:

  1. srand AFAIK лучше всего использовать только один раз в проекте, чтобы сделать случайные числа как можно больше случайных.
  2. Этот подход более точен, поскольку два объекта не могут использовать одинаковое расположение памяти.

, пожалуйста, советую мне.

EDIT: С какой целью участник object_id создан? внутри конструктора или снаружи (до списка инициализатов или после) hm hm? спасибо большое!

+1

Как насчет использования старого старого GUID? –

+2

Можете ли вы использовать указатель экземпляра объекта как идентификатор? Трудно ответить на этот вопрос, потому что он точно зависит от того, для чего нужен идентификатор; какое поведение следует соблюдать в отношении копирования, сериализации, времени жизни и т. д. – tenfour

+0

спасибо, как использовать GUID в C++? – codekiddy

ответ

3

Это небезопасный подход. Вы не рассматривали не виртуальное множественное наследование. Это редко, но легально.

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

Это зависит от вашего определения «безопасный». Есть два 'Object', поэтому есть два ID. –

+0

Ничего себе, хорошее место. Я не думал об этом:/так что вы рекомендуете в этой ситуации, выбирая уникальный идентификатор для объекта? спасибо – codekiddy

+1

@codekiddy: Просто: Не надо. – Puppy

1

OK это первый раз, когда я отвечая на мой собственный вопрос, но вот то, что я сделал, чтобы сделать 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; 
} 

Это работает просто отлично, и каждый объект, который теперь имеет свой собственный уникальный идентификатор!

Смежные вопросы