author:
- luixiao1223
title: 从templates中抽离无关的参数
代码膨胀
template<typename T, std::size_t n>
class SquareMatrix {
public:
...;
void invert();
};
代码开始膨胀
SquareMatrix<double,5> sm1;
sm1.invert();
SquareMatrix<double,10> sm2;
sm2.invert();
第一次修改
template<typename T>
class SquareMatrixBase{
protected:
void insert(std::size_t matrixSize);
};
template<typename T, std::size_t n>
class SquareMatrix:private SquareMatrixBase<T> {
using SquareMatrixBase<T>::invert;
public:
void invert(){invert(n);}
};
注意这里可以解决传递参数的问题,但是另一个问题也浮现.基类如何能访问到继承类的数据呢?要计算逆矩阵就需要访问继承类的矩阵数据.
把指针也作为参数传递进来.
template<typename T>
class SquareMatrixBase {
protected:
SquareMatrixBase(std::size_t n, T *pMem)
: size(n), pData(pMem) {}
void setDataPtr(T *ptr) { pData = ptr; }
...;
private:
std::size_t size;
T *pData;
};
template<typename T, std::size_t n>
class SquareMatrix: private SquareMatrixBase<T> {
public:
SquareMatrix()
: SquareMatrixBase<T>(n, data) {} //把指针数据传递进去
private:
T data[n*n];
};
也许派生类是动态内存
template<typename T, std::size_t n>
class SquareMatrix: private SquareMatrixBase<T> {
public:
SquareMatrix()
:SquareMatrixBase<T>(n,0),
pData(nw T[n*n])
{this->setDataPtr(pData.get());}
private:
boost::scoped_array<T> pData;
};
缺点
指针失去封装,对于管理指针带来风险和复杂性.比如你要如何判断处于派生类拥有的指针是否已经被删除了.