我正在尝试编写一个简单的Matrix类,使用C ++模板试图刷新我的C ++,并向同事编写解释。
这就是我的目标:
template class<T>
class Matrix
{
public:
Matrix(const unsigned int rows, const unsigned int cols);
Matrix(const Matrix& m);
Matrix& operator=(const Matrix& m);
~Matrix();
unsigned int getNumRows() const;
unsigned int getNumCols() const;
template <class T> T getCellValue(unsigned int row, unsigned col) const;
template <class T> void setCellValue(unsigned int row, unsigned col, T value) const;
private:
// Note: intentionally NOT using smart pointers here ...
T * m_values;
};
template<class T> inline T Matrix::getCellValue(unsigned int row, unsigned col) const
{
}
template<class T> inline void Matrix::setCellValue(unsigned int row, unsigned col, T value)
{
}
我被困在ctor上,因为我需要分配一个新的[] T,看起来它需要是一个模板方法 - 但是,我不确定我是否曾经遇到过一个模板化的ctor。< / p>
我如何实施ctor?
答案 0 :(得分:5)
您可以在构造函数中访问T
,因此构造函数本身不需要是模板。例如:
Matrix::Matrix(const unsigned int rows, const unsigned int cols)
{
m_values = new T[rows * columns];
}
考虑为数组使用智能指针,如boost::scoped_array
或std::vector
,以便更轻松地进行资源管理。
如果您的矩阵具有固定大小,则另一个选项是将行和列作为模板参数与T一起使用:
template <class T, unsigned Rows, unsigned Columns>
class Matrix
{
T m_values[Rows * Columns];
};
最大的优点是大小是矩阵类型的一部分,这对于在编译时强制执行规则很有用,例如,确保两个矩阵在进行矩阵乘法时具有兼容的大小。它也不需要动态分配数组,这使资源管理更容易。
最大的缺点是你不能改变矩阵的大小,所以它可能无法满足你的需要。