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);
};
Where 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>
,我从类数组中得到一个异常,说我试图分配两个不同长度的数组。只要我更改代码,使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
初始化为合适的大小。
相关文章:
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 确保所有构造函数调用相同的函数 c++ 设计模式
- 减少复制构造函数调用
- 使用回调函数从构造函数调用虚拟/派生方法的替代方法?
- 在 Google 测试中,我可以从构造函数调用 GetParam() 吗?
- C++ - 从另一个类构造函数调用类构造函数
- 在C++中初始化带有和不使用构造函数调用的对象有什么区别
- 是否可以从移动构造函数调用默认构造函数?
- 在模板生成器模式中分解重复的构造函数调用
- std::atexit 从全局对象的构造函数调用时的排序
- 对构造函数调用的约束
- 编译器错过了无效的构造函数调用,并调用不存在的(或私有的)默认构造函数
- 用构造函数调用填充向量
- 创建指针时是否没有构造函数调用
- 使用 emplace_back 避免移动构造函数调用的最佳方法?
- C++ 抽象类构造函数调用
- 为什么函数参数将带有参数的构造函数调用
- 为什么比“构造函数”调用更多的“解构器”调用
- 将对象传递给函数并不是导致构造函数调用