簡體   English   中英

c ++是參數化構造函數中調用的默認構造函數嗎?

[英]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_tArraym_tArray將首先默認構造,然后在構造函數中分配。 在這里,我們使用成員初始化列表立即將m_tArray初始化為正確的大小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM