模板类对普通类的继承

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

 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]数组进行搜索即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值