如果我在另一个构造函数中调用默认构造函数,它会崩溃我的程序.我相信它array_不会在默认构造函数中动态分配.我该如何解决这个问题.
template < typename T >
class Matrix
{
public :
size_t n_{1};
size_t m_{1};
T* array_{nullptr};
public :
Matrix();
Matrix(size_t n, size_t m) {
n_ = n;
m_ = m;
array_ = new T[n_ * m_];
Matrix();
}
}
template < typename T >
Matrix<T>::Matrix(){
for(int i=0;i < n_ * m_; i++)
array_[i] = {};
}
Run Code Online (Sandbox Code Playgroud)
我会像这样构造代码:
template <typename T>
class Matrix
{
size_t n_;
size_t m_;
T* array_;
public:
Matrix() : Matrix(1, 1) {}
Matrix(size_t n, size_t m) : n_(n), m_(m), array_(new T[n_ * m_]()) {}
~Matrix() { delete [] array_; }
// ...
};
Run Code Online (Sandbox Code Playgroud)
这实现了与您的代码预期相同的效果(即默认构造函数生成1×1矩阵,并且所有元素都进行了值初始化),但它使用核心语言功能来简洁地表达:
()对每个元素进行值初始化; 不需要循环.如果您计划使矩阵类可复制,请务必遵守五条规则.如果您只需要一个不可复制(但可移动)类型,则更改array_to 的类型std::unique_ptr<T[]>并删除自定义析构函数.