1

class Address作成時にフィールドaddrを一意の値に初期化する を実装したいと思います。Addressこの値は、インスタンスを作成するたびに 1 ずつ増加する必要があります。

例を挙げましょう。次のコードが実行された後:

Address x;
Address y;

x.addrは 1 であるy.addr必要がありますが、2 である必要があります。

それを達成するために、Curiously Recurring Template Patternを考えていました。それは実現可能でしょうか?また、同じ動作を実現するためのより簡単な方法はありますか?

TIA、ジル

4

5 に答える 5

7

オブジェクトの破壊をキャプチャする必要がないため、ここでは実際には必要ありません。そのウィキペディアのページの例では、そのタイプのオブジェクトがいくつ存在するかの現在の合計が保持されていることに注意してください。そのため、CRTP には 2 つの便利な機能があります。

  1. これは基本クラスであるため、そのデストラクタが呼び出されます (メンバーもこれを実現します)。
  2. 派生クラス型でテンプレート化されているため、継承するクラスごとに個別のカウンターがあり、複数の継承を使用してそれぞれ独自の CRTP ベースを含める場合、階層内の異なるクラスを含め、各クラスに多くのコードを記述する必要はありません。

単一のクラスの各メンバーに一意の値が必要な場合は、スレッドセーフは別として、次のようにできます。

int get_id() {
    static int counter = 0;
    return ++counter;
}

class Address {
    int addr;
  public:
    Address() : addr(get_id()) {}
};

CRTP の例に従って、追跡する複数のクラスがあり、それぞれに独自の ID スペースを持たせたい場合は、テンプレートget_id化して引数として使用できます。Address

そして、このユース ケースでは、CRTP を使用した場合、データ メンバーaddrをテンプレート ベース クラスに配置できます。これは、それを使用する各クラスの入力が少ないため、多くのクラスがある場合に役立ちます。

template <typename Derived>
class unique_addr {
  protected:
    int addr;
    unique_addr() : addr(get_id<Derived>()) {}
};

class Address : public unique_addr<Address> {
};

class OtherAddress : public unique_addr<OtherAddress> {
};
于 2011-04-06T17:33:00.460 に答える
1

それはあなたがやろうとしていることのやり過ぎのようです。一意の値だけが必要な場合は、静的整数を使用して、オブジェクトをインスタンス化するたびに増分します。次に、インスタンスごとの (つまり、静的ではない) 変数をその値に設定します。

于 2011-04-06T17:33:47.573 に答える
0

クラス内部の静的カウンターを使用することもできます。

class Address
{
  static int s_Count; // define this variable in appropriate cpp file
  int addr;
public:
  Address () : addr(++ s_Count) {}
};
于 2011-04-07T03:36:13.640 に答える