Всем привет!
Есть задачка, которую я уже решил, но полистав книгу Александреску,
ришил что я не понимаю в проектировании ничего вообще. Есть решение лучше чем мое?
Итак:
Есть *фиксированое* число типов, скажем 3 (на самом деле их 15). Нужен класс
class CArrayClass
{
InitArray ( int NumItems, ТИП* pArray ); // создает массив
RemoveItem( ТИП Item ); // удалить элемент массива со значением Item
ТИП* m_pArray;
};
Вот три типа которыми этот класс должен уметь оперирировать:
typedef char STR255[255];
typedef struct {
DWORD l,r,b,d;
} RECT;
typedef unsigned int UINT;
Cоздание простого шаблона не помогает по причине того, что копировать STR255 нужно будет не
m_pArray[i]=pArray[i]
а
*m_pArray[i]=*pArray[i]
не говоря уже о сравнении в методе RemoveItem.
Cоздание базового темплейта с виртуальными функциями
void CopyItem(TYPE* pdst, TYPE src)
BOOL СompareItems(TYPE item1, TYPE item2)
переопределенными в темлейтах TArrayValue и TArrayPointer не очень хорошо, т.к. сгенерится
много классов (ведь так? =), что нежелательно из-за большого обема.
Мое решение:
typedef unsigned char* PBYTE;
class CArrayBase
{
protected:
CArrayBase();
virtual ~CArrayBase;
InitArray ( int NumItems, PBYTE* pArray ); // создает массив
RemoveItem( PBYTE Item ); // удалить элемент массива со значением Item
virtual void CopyItem(PBYTE* pdst, PBYTE src) {};
virtual BOOL CompareItems(PBYTE item1, PBYTE item2) {return TRUE;};
PBYTE* m_pArray;
int m_TypeSize; // реальный размер того что передается через PBYTE
// в моей реальной задаче это в любом случае надо, для других целей..
};
template <class TYPE, int TYPE_SIZE>
class TArrayPointer: public CArrayBase // темплейт для ряботы с указателями (STR255 и RECT*)
{
public:
CArrayBase() {m_TypeSize=TYPE_SIZE;}
virtual void CopyItem(PBYTE* pdst, PBYTE src)
{ **((TYPE*)pdst)=*(*(TYPE*)&src) };
virtual BOOL CompareItems(PBYTE item1, PBYTE item2)
{ return _strnicmp((LPCSTR)item1,(LPCSTR)item2,__TYPE_SIZE); };
};
// ну и по такому же принципу темплэйт TArrayValue для работы с UINT
Пожалуйста, расскажите как такую задачу спроектировать лучше?