模板類對普通類的繼承
前幾天需要用到這樣一種資料結構,如下:
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]陣列進行搜尋即可。