1. 程式人生 > >模板類對普通類的繼承

模板類對普通類的繼承

前幾天需要用到這樣一種資料結構,如下:

 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]陣列進行搜尋即可。