I am trying to write a trivial Matrix class, using C++ templates in an attempt to brush up my C++, and also to explain something to a fellow coder.
This is what I have som far:
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)
{
}
I’m stuck on the ctor, since I need to allocate a new[] T, it seems like it needs to be a template method – however, I’m not sure I have come accross a templated ctor before.
How can I implemnt the ctor?
You can access
Tin the constructor, so the constructor itself needs not be a template. For example:Consider using a smart pointer, like
boost::scoped_arrayorstd::vectorfor the array to make resource management a bit easier.If your matrix has a fixed size, another option would be to take the rows and columns as template parameters along with T:
The biggest advantage is the size is then part of the type of a matrix, which can be useful for enforcing rules at compile-time, for example, ensuring two matrices are of compatible sizes when doing matrix multiplication. It also doesn’t require the array to be dynamically allocated, which makes resource management a bit easier.
The biggest disadvantage is that you can’t change the size of the matrix, so it may not work for what you need.