1

参照カウントの基本クラスを実装していて、そのインターフェイスを継承する作成中のオブジェクトごとに一意の番号を設定したいと思います。

そのクラスのコードスニペットは次のとおりです。

ヘッダ:

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

CPP:

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

それが安全なアプローチであるかどうか、そうでない場合はどうしてですか?私は2つの理由でrandとsrand関数を使用しませんでした:

  1. srand AFAIKは、プロジェクトで1回だけ使用して、可能な限り乱数をランダムにするのが最適です。
  2. 2つのオブジェクトが同じメモリ位置を共有できないため、このアプローチはより正確です。

アドバイスしてください。

編集:どの時点でメンバーobject_idが作成されますか?コンストラクターの内部または外部(初期化リストの前または後)hm hm?どうもありがとう!

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

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

テスト:

//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 に答える