5

私の先生は、自動的に生成される ID データ メンバーを作成するように私たちに要求しました。最も適切なタイプは何ですか? 答えが static const int ID の場合。

constである間に自動的に生成するにはどうすればよいですか?

4

5 に答える 5

10

ID は一意でなければならないため、2 つのインスタンスが同じ ID を決して取得しないようにする必要があります。また、クラス外の誰もが UID の生成に干渉してはなりません。

まず、クラスで静的フィールドを定義します。

class Data
{
private:
    static int newUID;

(...)
};

// The following shall be put in a .cpp file
int Data::newUID = 0;

次に、各インスタンスが作成された後、新しい ID 値を取得し、newUID カウンターをインクリメントする必要があります。

class Data
{
(...)
    const int uid;  

public:
    Data()
        : uid(newUID++)
    {
    }

    int GetUid()
    {
        return uid;
    }
};

クラスを除いて誰も内部 newUID にアクセスできません。ID はインスタンスごとに自動的に生成され、2 つのインスタンスが同じ ID 番号を持つことは (ほぼ1つで) 確実です。


1 40 億を少し超えるインスタンスを生成しない限り

于 2013-03-15T10:15:18.607 に答える
2

以下に例を示します。

class SomeClass {
   static int currID;

public:
   const int ID;

   SomeClass() :
      ID(currID++) {  // Initialization list used to initialize ID

   }
};

そして、これを .cpp ファイルのどこかに置く必要があります:

int SomeClass::currId = 0;

これは、初期化リストを使用してトリックを行います。constインスタンス内のメンバーに割り当てることができる初期化リストにのみあるため、この方法で行う必要があります。

中心となる概念は、将来作成されるインスタンスに割り当てられる ID を追跡するために「グローバル設定」が必要であるということです。currIDこの例にあります。クラスで作成された各インスタンスに対して、currIDそのインスタンスの ID として の値を割り当て、それをインクリメントします ( currID)。このようにして、一意の ID を持つインスタンスを取得します。

于 2013-03-15T10:15:38.363 に答える
1

教師がブースト ライブラリを許可している場合は、Boost.Uuidを試してください。例はこちらです。RFC 4122に準拠しています。

于 2013-03-15T10:32:30.360 に答える
1

const ID を int として作成し、コンストラクター初期化リストで初期化します

 SomeClass(): id(++staticIncrementingInt){
   ///other stuf here
 }

お役に立てれば。

于 2013-03-15T10:09:12.383 に答える
1

実際には、構造の初期化リストで関数 (この場合はrand ) を呼び出すことができます。どのように種をまくことができるかはあなた次第です。

于 2013-03-15T10:22:28.040 に答える