0

テンプレートとコンポジションスタイルのコーディングに少し問題があります。*thisパラメーターを使用して別のコンストラクター内に作成されているオブジェクトがあります。不明な点がある場合は申し訳ありません。コードは次のとおりです。

external.hファイル内:

class outer {
  public:
    outer(int w, int l);
    int getWidth();
    int getLength();
  private:
    inner<outer> test(*this);
    int width;
    int length;
};

outer::outer(int w, int l) {
  width = w;
  length = l;
}

int outer::getLength() {
  return length;
}

inner.hファイル内

template<typename T>
class inner {
  public:
    inner(T &name);
  private:
    int top;
    int bot;
};

template<typename T>
inner<T>::inner(T &name) {
    top = name.getLength() /2;
    bot = -name.getLength() / 2;
}

これに対処するものがオンラインで見つからないため、これが許可されているかどうかはわかりません。コンパイラーは、outer.hの*thisステートメントに問題があります。

よろしくお願いします。

4

1 に答える 1

3

C ++ 03を使用している場合は、コンストラクターで初期割り当てを実行する必要があります。

class outer {
  public:
    outer(int w, int l);
    int getWidth();
    int getLength();
  private:
    // Member variables are initialized in the order they are declared here.
    int width;
    int length;
    inner<outer> test;
};

outer::outer(int w, int l)
  : width(w)
  , length(l)
  , test(*this)
{
}

編集: Kerrek SBは、変数の順序を変更する必要があることも確認しています。それらはクラスで宣言した順序で初期化され、最後に初期化test する必要があるため、他の変数は初期化されます。

于 2013-03-19T00:04:07.747 に答える