c ++是参数化构造函数中调用的默认构造函数?

时间:2013-03-16 15:58:34

标签: c++ templates constructor default-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值)。那是对的吗?如果是,我该如何改变这种行为? This is another question that I posted yesterday, which, even though is about inheritance, not composition, is very much related to the question in this thread. 干杯!

1 个答案:

答案 0 :(得分:2)

您需要使用Stack的构造函数的成员初始化列表:

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

如果你拥有它,m_tArray将首先默认构造,然后在你的构造函数中分配。在这里,我们使用成员初始化列表立即将m_tArray初始化为正确的大小。