2

C++ テンプレート メカニズムに関する 1 つの小さな質問です。Point というクラスがあるとします。ここで、「データ」が T (テンプレート) データ メンバーのみを含むテンプレート クラス/コンテナーであるとします。つまり、「データ」は多かれ少なかれ次のようになります。

Template <class T>
class Data {
T dMember;
……..
};

ここで、誰かが main.cpp ファイルでこのクラスを使用し、次の宣言を実行するとします。

Data<Data<Point>> d;

作成されたオブジェクトがどのように見えるかを完全に理解しようとしています。コンパイラを使用してクラス呼び出しに参加しようとしましたが、役に立ちませんでした。Data は Data を初期化して自分自身を一度呼び出す必要があることは知っていますが、実際には何をしているのでしょうか? アクティブ化されているコンストラクターはありますか?

ありがとう、ガイ

4

3 に答える 3

5

Data2次の例でインスタンス化するようなものです。

class Data1 {
    Point dMember;
};

class Data2 {
    Data1 dMember;
};

Data2 d; // = Data<Data<Point>> d;

基本的に、のラップのラップPoint

于 2013-01-15T21:05:14.037 に答える
2

Data は Data を初期化して自分自身を一度呼び出す必要があることは知っていますが、実際には何をしているのでしょうか? アクティブ化されているコンストラクターはありますか?

データは、実際には 1 回で自分自身を呼び出しません。これは、内側のデータと外側のデータが 2 つの異なるクラスであるためです。一般に、コンパイラが を見た場合、Data<Data<Point>>最初に内部部分、つまり を認識しData<Point>ます。次に、テンプレートをインスタンス化します。つまり、テンプレートによって記述されたプロパティを持つクラスを作成します。Data はクラスではなく、多数のクラスを作成するために使用できるテンプレートであることを理解することが重要です。これらのクラスのそれぞれは、他のクラスとは異なります。それらは異なるタイプであり、相互に実際の関係はありません。Data<Point>テンプレートの 1 つのインスタンスであり、同じプロパティを持つクラスです。たとえば、

class Foo {
  Point dMember;
  ...
};

私はそれを単にフーと呼びます。次に、コンパイラは をData<Data<Point>>確認しますが、これはData<Foo>. テンプレートを再度インスタンス化しますが、今度は Foo (つまり、最初のインスタンス化で取得したクラス) をパラメーターとして使用します。最初のインスタンス化の型のメンバーを持っていることを除いて、原則として最初のクラスから完全に独立した別のクラスを取得します。

class Bar {
  Foo dMember;
  ...
};

それで全部です。データはそれ自体を呼び出しません。データは型として存在しません。初期化で呼び出されるコンストラクターは Bar のコンストラクターであり、Bar のコンストラクターは Foo のコンストラクターを呼び出します。クラス テンプレート内にあるものはすべてテンプレート自体であるため、Data で定義したコンストラクターは実際のコンストラクターではありません。したがって、これはコンストラクター テンプレートであり、Foo や Bar のコンストラクターを呼び出すと、コンパイラーはそのテンプレートを使用して実際のコンストラクターをインスタンス化します。

データは、コンパイラが実際のクラス (および必要に応じてメンバー関数) を構築するための青写真に過ぎず、何かを再生したり、呼び出したり、初期化したりするためにそこに到達することはありません。

于 2013-01-16T07:38:07.883 に答える
1

Data< Point > のテンプレートは次のようになります。

class Data<Point> {
  Point dMember;
  ...
};

Data< Data< Point>> のテンプレートは次のようになります。

class Data<Data<Point>> {
  Data<Point> dMember;
  ...
};

2 つ目では、Data< Point > が他のメンバー変数として使用されます。

Data< T > にコンストラクターがある場合は、2 回呼び出されます。最初は Data< Point > です。これはメンバー変数であり、それらのコンストラクターが最初に呼び出されるためです。次に、Data< Data< Point>> について。

于 2013-01-15T22:49:21.780 に答える