模板类对普通类的继承

来源:互联网 发布:淘宝店小成本运营策略 编辑:程序博客网 时间:2024/04/29 08:24

前几天需要用到这样一种数据结构,如下:

 class BaseReg
{
public:
 BaseReg(){Datalen=0;}
 INT8U Length(){return Datalen;}
 protected:
 INT8U Datalen;

INT8U Data[8];
};

此结构用于存储寄存器数据,但是数据长度固定,以前8个字节够用了,但是现在长度最多的有20个字节,如何解决此问题。如果将结构中Data数组直接扩展到20字节,会浪费很多空间。一开始想到了用模板,如下:

template<INT8U DATA_LEN>

class BaseReg

{

public:

private:

INT8U Data[DATA_LEN];

INT8U Datalen;

};

这样可以根据不同数据长度定义不同对象如:

BaseReg<4> br4;

BaseReg<6> bt6;

但是BaseReg<4>和BaseReg<6>不是同一类型,不能存入同一个数组中,这样要在各种寄存器中进行搜索就很困难了。于是想到如下解决方案:

class BaseReg
{
public:
 BaseReg(){Datalen=0;}
 INT8U Length()const{return Datalen;}
 virtual void SetData(INT8U* data)=0;
 virtual INT8U GetData(INT8U i)const=0;
 virtual void PrintData()const=0;
protected:
 INT8U Datalen;
};
template<INT8U DATA_LEN>
class TRegData:public BaseReg
{
public:
 TRegData()
 {
  //memset(this,0x00,sizeof(*this));//此行语句将虚函数表指针也置0了,故要注释掉
  Datalen=DATA_LEN;
 }
 void SetData(INT8U* data)
 {
  memcpy(Data,data,Datalen);
 }
 INT8U GetData(INT8U i)const
 {
  return Data[i]; 
 }
 virtual void PrintData()const
 {
  for (INT8U i=0; i<Datalen; ++i)
  {
   printf("%02X ",Data[i]);
  }
  printf("/n");
 }
private:
 INT8U Data[DATA_LEN];
};

于是可以采用如下使用方法:

BaseReg* bg[5];

TRegData<4> tr4;

TRegData<5> tr5;

bg[0]=&tr4;

bg[1]=&tr5;

于是对bg[5]数组进行搜索即可。