[英]c++ is default constructor called in parametrized constructor?
我有以下模板類:
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);
};
Array看起來像這樣:
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];
}
因此,Stack由Array和一些額外的功能組成。 我的問題是 ,在數組中,我將s_nDefaultSize
定義為512
,我嘗試實例化Stack<int,1024>
我從類Array中得到一個異常,說我正在嘗試分配兩個不同長度的數組。 一旦我更改代碼使得s_nDefaultSize=1024
(因此它匹配模板的非類型參數nSize
),一切都很好。 換句話說,只要s_nDefaultSize != nSize
就會發生異常。 所以,我的猜測是在上面的代碼中,在Stack<T,nSize>
的默認構造函數中,即m_tArray = Array<T>::Array(nSize);
m_tArray
是由Array的默認構造函數(使用s_nDefaultSize
)創建的,然后編譯器才會嘗試將其分配給Array<T>::Array(nSize)
(使用我的nSize
值)。 那是對的嗎? 如果是,我該如何改變這種行為? 這是我昨天發布的另一個問題,即使是關於繼承,也不是組合,與這個帖子中的問題非常相關。 干杯!
您需要使用成員初始化列表和Stack
的構造函數:
template<typename T, int nSize>
Stack<T,nSize>::Stack(int nCurrent)
: m_tArray(nSize)
{
m_nCurrent = nCurrentPos;
};
如你m_tArray
, m_tArray
將首先默認構造,然后在構造函數中分配。 在這里,我們使用成員初始化列表立即將m_tArray
初始化為正確的大小。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.