使用C ++模板类的简单矩阵示例

时间:2010-04-20 22:59:21

标签: c++ templates

我正在尝试编写一个简单的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?

1 个答案:

答案 0 :(得分:5)

您可以在构造函数中访问T,因此构造函数本身不需要是模板。例如:

Matrix::Matrix(const unsigned int rows, const unsigned int cols)
{
    m_values = new T[rows * columns];
}

考虑为数组使用智能指针,如boost::scoped_arraystd::vector,以便更轻松地进行资源管理。

如果您的矩阵具有固定大小,则另一个选项是将行和列作为模板参数与T一起使用:

template <class T, unsigned Rows, unsigned Columns>
class Matrix 
{ 
    T m_values[Rows * Columns];
};

最大的优点是大小是矩阵类型的一部分,这对于在编译时强制执行规则很有用,例如,确保两个矩阵在进行矩阵乘法时具有兼容的大小。它也不需要动态分配数组,这使资源管理更容易。

最大的缺点是你不能改变矩阵的大小,所以它可能无法满足你的需要。