0

次のテンプレート クラスがあります。

template<typename T, int nSize> class Stack{
private:
    int m_nCurrentPos;
    Array<T> m_tArray;
public:
    Stack(int nCurrentPos = 0);
    ...
};

デフォルトのコンストラクターは次のように機能します。

template<typename T, int nSize> Stack<T,nSize>::Stack(int nCurrent){ 
    m_nCurrent = nCurrentPos;
    m_tArray = Array<T>::Array(nSize);
};

配列は次のようになります。

template <typename T> class Array{
private:
    T* m_cData;
    int m_nSize;
    static int s_nDefaultSize;
public:
    Array();
    Array(int nSize);
    ...
};

そして、そのコンストラクタは次のとおりです。

template<typename T> Array<T>::Array(){
    m_nSize = s_nDefaultSize;
    m_cData = new T[m_nSize];
}

そして、明らかに、

template<typename T> Array<T>::Array(int nSize){
    m_nSize = nSize;
    m_cData = new T[m_nSize];
}

そのため、スタックは配列といくつかの追加機能から構成されています。私の問題はs_nDefaultSize、Arrayで say と定義し512、インスタンス化しようとするとStack<int,1024>、クラス Array から例外が発生し、異なる長さの 2 つの配列を割り当てようとしているということです。そのようにコードを変更するとすぐにs_nDefaultSize=1024(テンプレートの非型引数と一致するようにnSize)、すべて問題ありません。つまり、例外はすぐに発生しs_nDefaultSize != nSizeます。したがって、私の推測では、上記のコードでは、 のデフォルト コンストラクターでStack<T,nSize>、つまり、m_tArray = Array<T>::Array(nSize);m_tArrayArray のデフォルト コンストラクターによって作成され ( を採用s_nDefaultSize)、コンパイラーはそれをArray<T>::Array(nSize)(採用して my を採用) に割り当てようとします。nSize価値)。あれは正しいですか?はいの場合、どうすればこの動作を変更できますか? これは私が昨日投稿した別の質問です。構成ではなく継承に関するものですが、このスレッドの質問に非常に関連しています。乾杯!

4

1 に答える 1

2

次のコンストラクターでメンバー初期化リストを使用する必要がありますStack

template<typename T, int nSize>
Stack<T,nSize>::Stack(int nCurrent)
  : m_tArray(nSize)
{ 
    m_nCurrent = nCurrentPos;
};

あなたがそれを持っているように、m_tArray最初にデフォルトで構築され、次にコンストラクタで割り当てられます。ここでは、メンバー初期化リストを使用しm_tArrayて、適切なサイズにすぐに初期化します。

于 2013-03-16T16:10:46.207 に答える