Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблемы с реализацией универсального класса.

279
17 августа 2006 года
bave
456 / / 07.03.2004
На примере описываю в чём проблема:
Есть абстрактный класс связного списка:
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()...)
----------------------------------------------------------------------
395
17 августа 2006 года
RelB
367 / / 09.11.2002
[QUOTE=bave]На примере описываю в чём проблема:
Есть абстрактный класс связного списка:
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
240
17 августа 2006 года
aks
2.5K / / 14.07.2006
Используй шаблоны в конце концов - не надо будет определять классы для каждого типа хранимых значений.
279
17 августа 2006 года
bave
456 / / 07.03.2004
Я когда вопрос пишу - код пишу только для примера, забыл завиртуалить (тут в примере, не в своём исходнике), а вопрос задан - по getData(), вот собственно по нему ответа и жду.
240
17 августа 2006 года
aks
2.5K / / 14.07.2006
[QUOTE=bave]Я когда вопрос пишу - код пишу только для примера, забыл завиртуалить (тут в примере, не в своём исходнике), а вопрос задан - по getData(), вот собственно по нему ответа и жду.[/QUOTE]
В данном случае в дочерних классах не переопределяются виртуальные методы, а определяются новые =))
И подобные задачи так не решаются - неграмотно это.
А делается примерно так:
Код:
template<class type>
class CYorList{
public:
    void addData(type data){
                 ....
    }

    type getData(){
                 ....
    }

};
279
17 августа 2006 года
bave
456 / / 07.03.2004
ну вот примерно так тепреь и делаю... куда деваться то.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог