template<class type>
class CYorList{
public:
void addData(type data){
....
}
type getData(){
....
}
};
Проблемы с реализацией универсального класса.
Есть абстрактный класс связного списка:
class CAbstarctList
{
void Add();
void* getData() { return NULL; }
//...
};
Есть несколько потомков от него, причём разные списки потомки,
хранят данные разного типа:
public CSomeList1: public CAbstractList
{
//...
virtual void Add();
virtual type1* getData() { return &data; }
//...
protected:
type1 data;
};
public CSomeList2: public CAbstractList
{
//...
virtual void Add();
virtual type2* getData() { return &data; }
//...
protected:
type2 data;
};
Ну и ессествено, есть рабочий класс, который может вызывать методы
абстрактного:
CWorkList
{
public:
CWorkList(CAbstractList *pList) { m_pList = pList; }
void Add() { m_pList->Add(); }
//---???? GetData() ??? --------------//
protected:
CAbstractList *m_pList;
};
А вот как быть с методом GetData(), если все классы потомки разные типы возвращают??? (и как то бы обойтись без преобразования типов на
выходе GetData()...)
----------------------------------------------------------------------
Есть абстрактный класс связного списка:
class CAbstarctList
{
void Add();
void* getData() { return NULL; }
//...
};
Есть несколько потомков от него, причём разные списки потомки,
хранят данные разного типа:
public CSomeList1: public CAbstractList
{
//...
virtual void Add();
virtual type1* getData() { return &data; }
//...
protected:
type1 data;
};
public CSomeList2: public CAbstractList
{
//...
virtual void Add();
virtual type2* getData() { return &data; }
//...
protected:
type2 data;
};
Ну и ессествено, есть рабочий класс, который может вызывать методы
абстрактного:
CWorkList
{
public:
CWorkList(CAbstractList *pList) { m_pList = pList; }
void Add() { m_pList->Add(); }
//---???? GetData() ??? --------------//
protected:
CAbstractList *m_pList;
};
А вот как быть с методом GetData(), если все классы потомки разные типы возвращают??? (и как то бы обойтись без преобразования типов на
выходе GetData()...)
----------------------------------------------------------------------[/QUOTE]
Мнда...
Учим "наследование и полиморфизм"
В данном случае CAbstractList - вообще не асбтрактный класс, у него нет ни одной, чисто виртуальной функции, не говоря уже о просто виртуальных. Из-за этого CWorkList будет вызывать методы класса CAbstractList в любом случае и следовательно заморачиваться с типами не нужно, т.е. getData будет возвращать всегда void* :D
Используй шаблоны в конце концов - не надо будет определять классы для каждого типа хранимых значений.
Я когда вопрос пишу - код пишу только для примера, забыл завиртуалить (тут в примере, не в своём исходнике), а вопрос задан - по getData(), вот собственно по нему ответа и жду.
В данном случае в дочерних классах не переопределяются виртуальные методы, а определяются новые =))
И подобные задачи так не решаются - неграмотно это.
А делается примерно так:
Код:
ну вот примерно так тепреь и делаю... куда деваться то.