假如我们用一个模板类封装一个矩阵的数据,如果矩阵的大小改变,该模板类又会再次实例化出来一个,这样显然造成了代码的膨胀。
为了防止这样让我们来看代码吧:
#include <iostream>
#include <memory>
template<typename T>
class MatrixBase{
private:
std::shared_ptr<T*> square_;
protected:
template<typename Ty>
void set_data_ptr(std::shared_ptr<Ty*> ptr_);
public:
MatrixBase()=default;
virtual ~MatrixBase();
};
template<typename T>
template<typename Ty>
void MatrixBase<T>::set_data_ptr(std::shared_ptr<Ty*> ptr_)
{
this->square_ = ptr_;
}
template<typename T>
template<typename Ty>
MatrixBase<T>::MatrixBase(std::shared_ptr<Ty*> ptr_)
:square_(ptr_)
{
//constructor.
}
template<typename T>
MatrixBase<T>::~MatrixBase()
{
std::cout<<"in Base"<<std::endl;
this->square_.reset();
}
template<typename T>
class SquareMatrix : private MatrixBase<T>{
private:
int size_;
class Deleter{
public:
template<typename Ty>
void operator()(Ty** ptr, const int& N)
{
std::cout<<"delete !"<<N<<std::endl;
if(ptr != nullptr){
for(int i=0; i<N; ++i){
std::cout<<"start"<<i<<std::endl;
delete[] ptr[i];
}
std::cout<<"before end! "<<std::endl;
delete[] ptr;
std::cout<<"end"<<std::endl;
}
}
};
public:
SquareMatrix(const int& sz_);
~SquareMatrix()=default;
};
template<typename T>
SquareMatrix<T>::SquareMatrix(const int& sz_)
:size_(sz_)
{
T** temp_ptr = new T*[this->size_];
for(int i=0; i<this->size_; ++i){
temp_ptr[i]=new T[2];
}
auto Delete = std::bind(Deleter(), std::placeholders::_1, this->size_);
this->set_data_ptr(std::shared_ptr<T*>(temp_ptr, Delete));//这里的this->是必须的因为在编译阶段
//并不知道MatrixBase的模板参数类型,因此也就无法知道MatrixBase中有什么内容
//我们通过this->告诉编译器有这么个函数,但是也可以通过MatrixBase::set_data_ptr.
temp_ptr = nullptr;
}
int main()
{
SquareMatrix<int> s(2);
return 0;
}
我们来看看普通(非模板类)的private继承关于this->的区别:
#include <iostream>
class Base{
private:
int x=0;
public:
Base()=default;
virtual ~Base()=default;
protected:
void print()const;
};
void Base::print()const
{
std::cout<<"x: "<<x<<std::endl;
}
class Inherit : private Base{
private:
int y;
public:
Inherit();
~Inherit()=default;
};
Inherit::Inherit()
{
print(); //这里可以写成this->print(),也可以不写.
}
int main()
{
Inherit i;
return 0;
}