Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Как должен выглядеть базовый для них?

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
Yello



Зарегистрирован: 09.03.2006
Сообщения: 107

СообщениеДобавлено: Пт Окт 06 2006 22:59    Заголовок сообщения: Как должен выглядеть базовый для них? Ответить с цитатой

В С++.
Есть два «списковых» класса:

Список I:

Код:

class polynom;

class mcont{
mcont *nextcont;
monom mm;
friend class polynom;
};

class polynom{
unsigned int nom;
mcont* firstcont;
public:
polynom(void);
polynom(const polynom& p);
~polynom();
polynom& operator =(const polynom& p);
};


Список II:

Код:

class systemop;

class pcont{
pcont *next;
polynom pp;
friend class systemop;
};

class systemop{
unsigned int nop;
pcont* first;
public:
systemop(void);
systemop(const systemop&);
~systemop();
systemop& operator =(const systemop& s);
};


Как видите, оба «списка» абсолютно идентичные. И конструкторы, и деструктор, а также присваивание, работают тоже АБСОЛЮТНО ИДЕНТИЧНО (за исключением типов полей mm/pp, да и то лишь в к-ре копий и «=»). Вопрос: какие поля должен содержать БАЗОВЫЙ класс, чтобы все эти 4 метода были описаны в базовом классе (чтобы не писать два раза (почти) одно и то же в порождённых классах)? (В Страустрапе написано для случая, если бы вместо monom mm было monom *mpointer, а мне так не надо). Вообще не понятно – это должен быть «родитель», или я не так понимаю возможности механизма наследования (в порождённом классе можно «добавить новое», но не «заменить» поле)?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Kefir



Зарегистрирован: 16.04.2005
Сообщения: 443
Откуда: Пермь

СообщениеДобавлено: Ср Окт 11 2006 12:27    Заголовок сообщения: Ответить с цитатой

Есть такая штука как шаблоны или параметризированные классы или generic типы... Короче это все одно и то же... Короче 2 Ваших класса это один шаблон...
_________________
Самоловских Виталий aka Kefir
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
kolobok0



Зарегистрирован: 22.04.2005
Сообщения: 253
Откуда: Мсква

СообщениеДобавлено: Ср Окт 11 2006 15:18    Заголовок сообщения: Re: Как должен выглядеть базовый для них? Ответить с цитатой

Yello писал(а):
...Вообще не понятно – это должен быть «родитель», или я не так понимаю возможности механизма наследования (в порождённом классе можно «добавить новое», но не «заменить» поле)?


фигня заключается в том, что всё в мире относительно... и сам язык плюсы - не регламентирует порядок (эээээээ читай методологию) поиска и нахождения связей типа родитель-ребёнок... Для этого существуют методологии направленные именно на решение таких вопросов "Как перейти от задачи к программированию". Одна из таких метод - есть Объектно Ориентированный Анализ, Проектирование и т.д.. Данная метода строится на нахождении решений опирающихся ТОЛЬКО на ПОСТАВЛЕННУЮ ЗАДАЧУ. Всё лишнее - в топку. Это и есть - самый верный и самый жизненный подход (с точки зрения самих проектов).
Возвращаясь к баранам. Посмотрите на свои классы как на сущности из своей предметной области. И ответьте на вопросы - что у них одинаковое. Только следуйте строго этим правилам - постарайтесь ничего от себя НЕ привносить. Грань между агрегацией и наследованием - очень призрачная. Как говорит сам Буч:
"Если Вы не уверены, что налицо отношение общего и частного (is a), вместо наследования лучше применить агрегацию или что-нибудь ещё."
И ещё... Как лакмусовую бамажку для агрегации, он предлагает слудующую мысль...
Если(и только если) на лицо отношение "целое/часть" между объектами, их классы должны находиться в отношении агрегации друг с другом.


с уважением
(круглый)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Yello



Зарегистрирован: 09.03.2006
Сообщения: 107

СообщениеДобавлено: Чт Окт 12 2006 09:07    Заголовок сообщения: Ответить с цитатой

to Kefir: Ну, дело в том что я показал НЕ ВСЕ методы, а только СОВПАДАЮЩИЕ (у каждого класса ещё есть несколько методов, которых нет в другом классе). Надо мне было сразу об этом сказать.
Так что в этом случае (как понимаю) шаблон ничего не даст (вот если бы были только те методы, которые я указал - тогда да).
Нет, не агрегирование (наследование). Как позволяет синтаксис С++, можно сделать родитель таким:

class list{
protected:
unsigned int nom;
cont *firstcont;
public:
list(void);
list(const list& a);
~list();
list& operator =(const list& p);
};

class cont{
protected:
cont *nextcont;
friend class list;
};

А затем писать два наследника, НО в их конструкторе копий и присваивании будет ПОХОЖИЙ текст, отличающийся только типом данных в контейнере. То есть два раза написать почти одно и то же. А шаблон делать бесполезно (см. выше).
Может, так и надо (так и пишут)? Кроме того, это дурацкое наследование немного замедлит скорость выполнения (конструктора копий и присваивания). Так и надо?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Kefir



Зарегистрирован: 16.04.2005
Сообщения: 443
Откуда: Пермь

СообщениеДобавлено: Чт Окт 12 2006 09:39    Заголовок сообщения: Ответить с цитатой

Почему ж не даст. Делай родителя шаблоном и наследуй на здоровье...
_________________
Самоловских Виталий aka Kefir
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
kolobok0



Зарегистрирован: 22.04.2005
Сообщения: 253
Откуда: Мсква

СообщениеДобавлено: Чт Окт 12 2006 12:40    Заголовок сообщения: Ответить с цитатой

Yello писал(а):
....Кроме того, это дурацкое наследование немного замедлит скорость выполнения (конструктора копий и присваивания)...


это Вы погорячились...

(круглый)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Yello



Зарегистрирован: 09.03.2006
Сообщения: 107

СообщениеДобавлено: Чт Окт 12 2006 15:25    Заголовок сообщения: Ответить с цитатой

to Kefir: спасибо, попробую так.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...