私の先生は、自動的に生成される ID データ メンバーを作成するように私たちに要求しました。最も適切なタイプは何ですか? 答えが static const int ID の場合。
constである間に自動的に生成するにはどうすればよいですか?
私の先生は、自動的に生成される ID データ メンバーを作成するように私たちに要求しました。最も適切なタイプは何ですか? 答えが static const int ID の場合。
constである間に自動的に生成するにはどうすればよいですか?
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つで) 確実です。
以下に例を示します。
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 を持つインスタンスを取得します。
教師がブースト ライブラリを許可している場合は、Boost.Uuidを試してください。例はこちらです。RFC 4122に準拠しています。
const ID を int として作成し、コンストラクター初期化リストで初期化します
SomeClass(): id(++staticIncrementingInt){
///other stuf here
}
お役に立てれば。
実際には、構造の初期化リストで関数 (この場合はrand ) を呼び出すことができます。どのように種をまくことができるかはあなた次第です。