【问题标题】:c++ is default constructor called in parametrized constructor?c++ 是在参数化构造函数中调用的默认构造函数吗?
【发布时间】:2013-03-05 06:50:16
【问题描述】:

我有以下模板类:

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];
}

所以,Stack 是由 Array 和一些额外的功能组成的。 我的问题是,当我在 Array 中定义 s_nDefaultSize512,并尝试实例化 Stack&lt;int,1024&gt; 时,我从类 Array 中得到一个异常,说我正在尝试分配两个不同长度的数组。一旦我将代码更改为s_nDefaultSize=1024(因此它与模板的非类型参数nSize 匹配),一切都很好。因此,换句话说,只要s_nDefaultSize != nSize 就会发生异常。所以,我的猜测是,在上面的代码中,在Stack&lt;T,nSize&gt; 的默认构造函数中,即m_tArray = Array&lt;T&gt;::Array(nSize);m_tArray 是由 Array 的默认构造函数创建的(使用 s_nDefaultSize),然后编译器才会尝试分配它到Array&lt;T&gt;::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. 干杯!

【问题讨论】:

标签: c++ templates constructor default-constructor


【解决方案1】:

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

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

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

【讨论】:

  • 哇,它有效。谢谢!我使用初始化列表,但这次我想做除了初始化之外的其他事情,所以我将所有内容都推送到构造函数的主体中。我将阅读上面的链接以充分了解这两种方式之间的区别。干杯!
猜你喜欢
  • 2012-06-30
  • 2021-08-31
  • 1970-01-01
  • 1970-01-01
  • 2014-07-09
  • 1970-01-01
  • 2016-03-25
  • 2012-02-26
  • 1970-01-01
相关资源
最近更新 更多