Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задача, Классы 
:(
    Опции темы
fear
  Дата 7.6.2006, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 16.4.2006

Репутация: 1
Всего: 1



Есть абстрактный класс A. У него два класса потомка B и C, с переопределёнными ф-циями базового класса. 
Так же ещё есть класс H, которому нужно пользоваться либо объектами класса В либо С. Выбор каким классом объекта пользоваться определяется один единственный раз при создании объекта H (допустим его конструктору передаётся параметр, определяющий какой класс использовать В или С).

Как реализовать класс H, чтобы он работал исходя из приведённого выше?

Можно конечно сделать элементом класса H, указатель на объект класса А, в конструктор класса H добавив что-то типа
Код

H:H(bool param)
{
    if(!param) msg = new RTUMessageFrame()
    else msg =  new ACSIIMessageFrame()
}

где msg это A::msg

Хотелось бы вообщем услышать какой нибуть другой способ, позволяющий создавать объекты класса В или С в H не зная с чем именно мы будем работать.
 
PM MAIL   Вверх
Earnest
Дата 7.6.2006, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(fear @  7.6.2006,  20:13 Найти цитируемый пост)
где msg это A::msg

Если ты имел в виду A* msg; то это и есть самый нормальный способ, для того полиморфизм и придуман.
Более гибко создавать классы где-то в другом месте и передавать H уже готовый указатель на A. Во первых, классов может стать больше и bool не обойдещься. Во вторых, лучше Р избавить от лишних знаний об конкретных классах B и C. Н ведь все равно только интерфейсом A может пользоваться. 


--------------------
...
PM   Вверх
MAKCim
Дата 7.6.2006, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Абстрактная фабрика тебе поможет
Код

class A;

class abstract_factory
{
public:
    virtual A* create()=0;
};

...
class H
{
private:
    A* base;
public:
    H(abstract_factory& factory_)
        : base(factory_.create()) {}
};

теперь H ничего не будет знать об реализациях A, вопросами создания конкретных объектов (B, C, ...) будут заниматься реализации abstract_factory 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
fear
  Дата 8.6.2006, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 16.4.2006

Репутация: 1
Всего: 1



Дело в том что пользователь должен работать только с классом H, при этом про A,B,C он ничего не знает. 
Говоря предметнее, класс А представляет собой сообщение, В - сообщение в формате 1, С - в формате 2.
Пользователь знает лишь с каким форматом сообщения ему работать и методы класса H, при этом он не догадывается что в сообщении.
Объекты класса В или С в идеале должны создаваться в методах класса H.
Как бы так создавать объекты В или С в Н, не создавая H::A *msg? 
PM MAIL   Вверх
Earnest
Дата 8.6.2006, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Тогда пусть конструктор H получает информацию о формате сообщения (скажем, код) и передает этот код фабрике, запрашивая объект. Фабрика может где жить как синглетон.
Можно даже вместо объекта-фабрики использовать глобальную ф-ю:
Код

extern A* CreateMessage (FormatType ftype);

class H
{
private:
    A* msg;
public:
    H(FormatType ftype)
        : msg(CreateMessage(ftype)) {}
};


Ну и конечно лучше какие-нибудь умные указатели использовать всето встроенных... 


--------------------
...
PM   Вверх
MAKCim
Дата 8.6.2006, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



ты сам себе противоречишь
Цитата

должен работать только с классом H, при этом про A,B,C он ничего не знает. 

и сразу
Цитата

Объекты класса В или С в идеале должны создаваться в методах класса H.

т е H про B C не знает но их создает  smile  


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
MAKCim
Дата 8.6.2006, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Код

class A;

class abstract_factory
{
public:
    virtual A* use(message)=0;
};

class H
{
private:
    abstract_factory& factory_;
    // использовать factory_.use(<объект message>);
public:
    H(abstract_factory& p_factory)
        : factory_(p_factory) {}
};
 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0925 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.