Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: static inheretence  (Прочитано 8332 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Mayor
Специалист

ru
Offline Offline

« : 07-01-2009 07:30 » new

static inheretence

как унаследовать от класса, объект которого должен находиться в единственном экземпляре?
как создать такой базовый класс?

те при первом создании объекта базового или унаследованого класса, вызывается базовый конструктор, в дальнейшем при создании унаследованных объектов, базовый конструктор не вызвается, но все объекты могут пользоваться уже проинициализированными данными

соотвественно базовый деструктор вызывается после уничтожения всех унаследованных объектов, а не первого из них

пробовал писать отдельным классом - заколебался в конструкторе каждого класса вводить ссылку на базовый объект, и из-за этого не получается оставить дефалтовый конструктор

Записан

1n c0de we trust
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #1 : 07-01-2009 09:20 » 

Опиши пожалуйста задачу: в терминах "имеем" и "нужно"

насколько необходимо наследование?
может подойдёт static указатель + static счетчик ссылок?
Записан

Странно всё это....
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 07-01-2009 10:35 » 

Объект класса-потомка в силу полиморфизма одновременно своими типами имеет и класс-потомок, и класс-предок, и все предки предка до корня иерархии. Из того, что при полиморфизме оперируют многими типами, вовсе не следует, что за этим скрываются разные объекты этих типов. Объект всегда один, но приводим к разным типам в зависимости от потребностей.

Отсюда вопрос: что такое единичный вызов базового конструктора для предка с последующим не вызовом для потомков? Я не знаю, что это такое.

Задача решается с помощью делегирования - построения класса-обёртки вокруг класса исходного объекта. Исходный объект (один) может иметь сколько угодно объектов-обёрток вокруг себя с разными свойствами. Каждая обёртка перенаправляет сообщения исходному объекту, выполняя дополнительную обработку (если нужно). Контроль времени жизни исходного объекта можно осуществлять при помощи счётчика ссылок или при помощи управляющего объекта.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Mayor
Специалист

ru
Offline Offline

« Ответ #3 : 07-01-2009 15:27 » 

Опиши пожалуйста задачу: в терминах "имеем" и "нужно"

насколько необходимо наследование?
может подойдёт static указатель + static счетчик ссылок?

имеем инициализатор тапи, который создается\разрушается 1 раз за цикл программы и до кучи объектов других классов ( типа открытия линии, свойства телефона и тп), которым желательно иметь часть мемберов инициализатора своими мемберами

пока что мне приходится конструктору каждого объекта давать ссылку на объект инициализатор - как-то это не вяжется с основными принципами ООП
Записан

1n c0de we trust
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 07-01-2009 15:44 » 

пока что мне приходится конструктору каждого объекта давать ссылку на объект инициализатор
Для таких случаев есть сингельтон и статический метод типа getInstance, возвращающий указатель на объект, который хранится в приватном статическом свойстве класса.

типа
Код:
class Singleton{
    private:
        static Singleton *instance;
        Singleton();
        Singleton(const Singleton&);
        ~Singleton();
    public
        static Singletone* getInstance()
        {
            return instance;
        }
}
плюс пара доработок для корректной инициализации/удаления. Подсчёт ссылок, или что-нибудь такое. Или что-то более сложное требуется? Если у сингельтона есть иерархия потомков, то можно их все хранить в статическом map, например.
« Последнее редактирование: 07-01-2009 15:50 от Вад » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 07-01-2009 17:34 » 

Цитата: Вад
Если у сингельтона есть иерархия потомков, то можно их все хранить в статическом map, например.
У классического одиночки потомков быть не может, поскольку конструкторы закрыты.

Я советую писать обёртки.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 07-01-2009 17:37 » 

Цитата: Mayor1
пока что мне приходится конструктору каждого объекта давать ссылку на объект инициализатор - как-то это не вяжется с основными принципами ООП
При правильном проектировании подходящей фабрики это можно делать в одном месте программы в одном конструкторе, а в остальных местах использовать эту фабрику и не загромождать программу передачей указателя на главный объект.

Либо, как Вад посоветовал, использовать одиночку.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines