Выбор случайного числа для идентификатора объекта?

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

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

ЗАГОЛОВОК:

    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. этот подход является более точным, поскольку два объекта не могут совместно использовать одну и ту же ячейку памяти.

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

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


person codekiddy    schedule 01.01.2012    source источник
comment
Как насчет использования старого доброго GUID?   -  person user703016    schedule 01.01.2012
comment
Можете ли вы использовать указатель экземпляра объекта в качестве идентификатора? Трудно ответить на этот вопрос, потому что это зависит от того, для чего именно вам нужен идентификатор; какое поведение должно соблюдаться в отношении копирования, сериализации, времени жизни и т. д.   -  person tenfour    schedule 01.01.2012
comment
спасибо, как использовать GUID в C++?   -  person codekiddy    schedule 01.01.2012
comment
Как вы хотите использовать подсчет ссылок? Почему бы вам просто не использовать обычный std::shared_ptr для ваших объектов?   -  person Kerrek SB    schedule 01.01.2012
comment
Указатель экземпляра объекта @tenfour, который означает, что каждый объект будет иметь такой указатель, поэтому я буду использовать его адрес как идентификатор или что-то еще. это не то же самое, что и мой пример? Благодарю. (да, позже я также реализую конструктор копирования)   -  person codekiddy    schedule 01.01.2012
comment
@Kerrek SB, зачем мне использовать std::shared_ptr каждый раз для создания объекта, это то, что я пытаюсь каким-то образом сделать автоматически, реализуя объекты подсчета ссылок, спасибо.   -  person codekiddy    schedule 01.01.2012
comment
Я что-то упускаю? Я имею в виду, почему вы берете адрес переменной-члена (который в основном совпадает с this), а затем сохраняете его? Почему бы не использовать this?   -  person Mr Lister    schedule 01.01.2012
comment
@Mr Lister object_id(reinterpret_cast‹long long int›(this)) это не работает :) или как вы имеете в виду использовать это?   -  person codekiddy    schedule 01.01.2012


Ответы (2)


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

class A : public Object {};
class B : public Object {};
class C : public A, public B {}; // Now C has *two* IDs!
person Puppy    schedule 01.01.2012
comment
Это зависит от вашего определения сейфа. Есть два Object, поэтому есть два идентификатора. - person Oliver Charlesworth; 01.01.2012
comment
Вау, хорошее место. Я не думал об этом :/ так что вы порекомендуете в этой ситуации, выбрав уникальный идентификатор для объекта? спасибо - person codekiddy; 01.01.2012
comment
@codekiddy Расскажите нам, для чего вы хотите использовать эти идентификаторы в первую очередь. Уникальная идентификация объекта на протяжении всего времени существования приложения? Или навсегда? В общем, что вы собираетесь делать с этим идентификатором? - person user703016; 01.01.2012
comment
@Cicada Я сохраню этот идентификатор в std::map другого класса, который будет обрабатывать события, выбирая указатель функции, назначенный этому объекту, и не только это, но и этот идентификатор будет использоваться и для других целей (но наиболее важным является обработка событий испускается из объектов, которые испускают те же события), также я буду использовать его для автоматического удаления объектов. - person codekiddy; 01.01.2012

Хорошо, я впервые отвечаю на свой вопрос, но вот что я сделал, чтобы заставить работать 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;
}

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

person codekiddy    schedule 02.01.2012