如果我在另一个构造函数中调用默认构造函数,它会崩溃我的程序.我相信它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::Matrix(){ for(int i=0;i < n_ * m_; i++) array_[i] = {}; }
Kerrek SB.. 5
我会像这样构造代码:
templateclass 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_; } // ... };
这实现了与您的代码预期相同的效果(即默认构造函数生成1×1矩阵,并且所有元素都进行了值初始化),但它使用核心语言功能来简洁地表达:
初始化程序列出初始化类成员,不需要任何分配.
array-new表达式可以使用初始化器()
对每个元素进行值初始化; 不需要循环.
默认构造函数委托给通用构造函数.
如果您计划使矩阵类可复制,请务必遵守五条规则.如果您只需要一个不可复制(但可移动)类型,则更改array_
to 的类型std::unique_ptr
并删除自定义析构函数.
我会像这样构造代码:
templateclass 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_; } // ... };
这实现了与您的代码预期相同的效果(即默认构造函数生成1×1矩阵,并且所有元素都进行了值初始化),但它使用核心语言功能来简洁地表达:
初始化程序列出初始化类成员,不需要任何分配.
array-new表达式可以使用初始化器()
对每个元素进行值初始化; 不需要循环.
默认构造函数委托给通用构造函数.
如果您计划使矩阵类可复制,请务必遵守五条规则.如果您只需要一个不可复制(但可移动)类型,则更改array_
to 的类型std::unique_ptr
并删除自定义析构函数.