一意の識別子を生成するC++クラスを定義する必要があります。アイデアは、すべての可視クラスのすべてのインスタンスが一意の整数値によってタグ付けされるということです。それをインスタンスの「ハンドル」と呼びましょう。ハンドルは、システム内のすべてのインスタンスで一意である必要があります。
一部のインスタンスは他のインスタンスに関連している場合があります。その場合、それらのクラスは、親戚のハンドルを格納するメンバーを定義します。
ただし、すべてのインスタンスに実際に相対があるわけではありません。したがって、「未定義」の親戚を表すために特別なハンドル値が必要です。
その特別なインスタンスを定義するのに助けが必要です。これが私が試したことです:
class Handle {
public:
Handle(): mValue(newValue()) {};
static const Handle kUndefHandle(0); // (1)
protected:
Handle(int val): mValue(val) {}; // (2)
int mValue;
static int mNextValue = 1000; // start at 1000. (3)
static int newValue() { return mNextValue++; }
};
ノート:
行(3)はコンパイルされません(Clang3.x)。コンパイラーは、静的変数のインライン初期化を拒否します。修正は簡単です。実装ファイルでオフラインで初期化します。したがって、私のクラスをヘッダーのみにすることはできませんが、それを使用することはできます。
行(1)は、私の特別な定数インスタンスを定義します。残念ながら、コンパイラは「期待されるパラメータ宣言子」と言って失敗します。
私も試しました:しかし、サブクラスに入れてもstatic const Handle kUndefHandle = 0;
、コンパイラは「変数の型が不完全です'Handle'」と文句を言います。そして、RubyのようにC++でクラスを再開することはできません。
そのconstインスタンス宣言をクラスの外に置くことで、それを機能させることができます。クラススコープを失いますが、それは小さな欠点です。気にすれば、名前空間を引き続き使用できます。
ただし、これは、(2)行のコンストラクターをパブリックにした場合にのみ機能します。そして、私はそれを望んでいません。プログラマーに任意の値のハンドルを作成させたくありません。
なにか提案を?