こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

シリアルナンバーのチェックをしたいのですが

シリアルナンバーのチェックをしたいのですが

class base{
public:
int serial;
};

class A : public base{
public:
A():serial(5){}
};

class B : public base{
public:
B():serial(2){}
};

上記のように、継承先のクラス毎にシリアルナンバーを好きなように割り当てたいと思います。
ですが、このままではシリアルナンバーが重複する可能性があります。
そこで質問なのですが、重複を防ぐにはどのような方法があるのでしょうか。
コンパイル時にチェックできるか、そもそも重複しないような手段があるような気がするのですが、全く良い案が思いつかず質問した次第です。よろしくお願いします。

投稿日時 - 2010-09-08 20:39:59

QNo.6168254

暇なときに回答ください

質問者が選んだベストアンサー

#include <iostream>
using namespace std;

template<typename T> struct ClassToSerial{};
template<int VAL> struct SerialToClass{};

#define UNIQUE_SERIAL(CLASS, SERIAL) \
class CLASS; \
template<> struct ClassToSerial<CLASS> \
{ enum { value = SERIAL }; }; \
template<> struct SerialToClass<SERIAL> \
{ typedef CLASS type; }; \

#define GET_SERIAL(CLASS) ClassToSerial<CLASS>::value


class base
{
public:
 int serial;
};

UNIQUE_SERIAL( A , 1 );
class A : public base
{
public:
 A()
 {
  serial = GET_SERIAL(A);
 }
};

//UNIQUE_SERIAL( B , 1 ); // error
UNIQUE_SERIAL( B , 2 );
class B : public base
{
public:
 B()
 {
  serial = GET_SERIAL(B);
 }
};


void main(void)
{
 A a;
 B b;

 cout << a.serial << endl;
 cout << b.serial << endl;
}

こんな感じにすると、とりあえず重複を防ぐだけなら可能です。

コンパイル時にチェックする方式だと、
template<int VAL> class XXXX{};
というクラスを作った時に、
template<> clas XXXX<1> {...};
template<> clas XXXX<2> {...};
のような特殊化クラスが複数作れないことを利用する方向でなんとか出来ないでしょうか。

好きなように割り当てたい+そもそも重複しない、というのは良くわかりませんが、ユニークなシリアルを自動生成するだけなら、__FILE__ , __LINE__ マクロからハッシュを自動生成、みたいな感じで何とかできるかもしれません。

投稿日時 - 2010-09-09 14:09:48

お礼

希望通りの動作が出来ました、ありがとうございます。
実は偶然にもテンプレートの本を読み進めている所だったので、興味深いコードでした。
まだ理解が十分ではないのですが、これはNo.1氏のクラス名の重複に近い考え方ですよね。

>好きなように割り当てたい+そもそも重複しない、というのは良くわかりませんが
説明不足で申し訳ありません。
実はシリアルナンバーは配列のソートに使う予定でして、ソート順を変えたい時には自動生成ですといろいろ不便になりそう、という理由がありました。

投稿日時 - 2010-09-09 22:03:09

ANo.2

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

 コンストラクタで自動生成するとかなら、ユニークシリアルナンバー生成用の処理でも呼びだして対応することは可能ですが、「好きなように割り当てたい」という時点で自動生成はありえないのかと思います。重複チェックしたところで代替のシリアルナンバーをどうするのかって話にもなります。

 コンパイラでチェックするなら、クラス名をA,Bではなくhoge5とかhoge2のようにシリアルナンバーを使った名前にしたら、クラス名の重複で弾いてくれるような気はしますが……

投稿日時 - 2010-09-09 01:23:16

お礼

回答ありがとうございます。

>、「好きなように割り当てたい」という時点で自動生成はありえないのかと思います。重複チェックしたところで代替のシリアルナンバーをどうするのかって話にもなります。
はい、その通りです。
代替のナンバーについては、実はこの後シリアルナンバー順にソートした配列を作ろうと考えていました。
ですので代替のナンバーを作るような処理をしてソート順が狂っても困るので、エラーを出して教えてくれるのが一番助かるかな、と思っています。

クラス名で判断するのは面白い発想ですね。
まー出来ればクラス名に制限はかけたくないので、今回はちょっと使わない方向で考えようと思います。

投稿日時 - 2010-09-09 21:13:06