Выбор случайного числа для идентификатора объекта? - PullRequest
1 голос
/ 01 января 2012

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

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

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))
    {
    }

Я в восторге, если это безопасный подход или нет, если нет, то почему?Я не использовал функции rand и srand по двум причинам:

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

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

РЕДАКТИРОВАТЬ: В какой момент создается элемент object_id?внутри конструктора или снаружи (до списка инициализации или после) хм хм?Большое спасибо!

Ответы [ 2 ]

3 голосов
/ 01 января 2012

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

class A : public Object {};
class B : public Object {};
class C : public A, public B {}; // Now C has *two* IDs!
1 голос
/ 02 января 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(){}
    };

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;
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...