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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> полиморфная модификация объектов 
:(
    Опции темы
baldina
Дата 11.11.2011, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



Цитата(mes @  11.11.2011,  17:55 Найти цитируемый пост)
не понятно что делает выражение, процитированное baldina

что делает выражение, понятно. не понятно, какую задачу оно решает.
Цитата(mes @  11.11.2011,  17:55 Найти цитируемый пост)
сформулируйте требования

собственно и я об этом. хочу понять задачу

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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



Если в ваш пример с сериализатором переписать так, чтобы можно было его использовать не только с сериализатором, но и с перемещением, вращением, перекрашиванием и др. визиторами (но избавившись от getId() ) - получится примерно то, что было в журнале "Мир ПК"

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


любитель
****


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

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



подкорректируем задачу.. 

есть команда print и есть несколько групп объект ов разных производителей.. 
задача:
1. позволить динамическое подключение каждой групы объектов
2. избежать зависимость между группами
3. внутри группы позволить использовать средства контроля типов


Это сообщение отредактировал(а) mes - 11.11.2011, 22:05


--------------------
PM MAIL WWW   Вверх
mes
Дата 11.11.2011, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



вот решение с комбинацией различных подходов :
http://liveworkspace.org/code/6148d7bc1a09...f9f74430ebd53c4

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




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


любитель
****


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

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



немного изменил завязку (регистрацию),  пододвинув ее в сторону си идеологии :
http://liveworkspace.org/code/c76143b44b1e...126584d06c5f01f

Это сообщение отредактировал(а) mes - 11.11.2011, 23:13


--------------------
PM MAIL WWW   Вверх
math64
Дата 11.11.2011, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



уже лучше - регистрировать нужно не отдельные классы, а модули.
PM   Вверх
boostcoder
Дата 11.11.2011, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



Цитата(mes @  11.11.2011,  23:12 Найти цитируемый пост)
немного изменил завязку (регистрацию),  пододвинув ее в сторону си идеологии :
http://liveworkspace.org/code/c76143b44b1e...126584d06c5f01f

отличная идея! правда для моей задачи ;)
PM WWW   Вверх
mes
Дата 11.11.2011, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(math64 @  11.11.2011,  22:32 Найти цитируемый пост)
уже лучше - регистрировать нужно не отдельные классы, а модули. 

math64, какую задачу озвучил, ту и решал smile

а регистрятся, кстати, не классы, а колбяк-функции smile


Это сообщение отредактировал(а) mes - 11.11.2011, 23:55


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


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



mes

Из дома сложновато бывает засесть за компьютер, попробую сегодня посмотреть и отписаться.
Спасибо за старания.
PM   Вверх
math64
Дата 12.11.2011, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



Цитата(mes @  11.11.2011,  23:52 Найти цитируемый пост)
а регистрятся, кстати, не классы, а колбяк-функции

но раньше нужно было регистрировать по одному callback'у на функцию, теперь - на модуль. Внутри модуля используется обычный Vsitor.
А задача была поставлена немного не такая.
Регистрацию пожно проводить примерно так (не тестировал, могут быть ошибки):
Код

namespace lib {
  struct object {
    virtual int getGroupId() = 0;
  };
  struct task {
    virtual int getTaskId() = 0;
  };
  struct RegisterBase {
    virtual void doApply(task&, object&) = 0;
    RegisterBase(int taskId, int groupId) { registry[index(taskId, groupId)] = this; }
    static std::map<int,Register*> registry;
    static void apply(task& t, object& o) { registry[index(t.getTaskId(), o.getObjectId()]->doApply(t, o); }
  private:
    int index(int taskId, int groupId) { return ((taskId << 16)&0xFFFF0000) | (groupId&0xFFFF); }
  };
  template<typename tsk, int groupId>
    struct Register {
      virtual void doApply(task& t, object& o) { apply(dynamic_cast<tsk&>(t), o); }
      virtual void doApply(tsk&, object&) = 0;
    private:
      Register() : RegisterBase(tsk::taskId, groupId) {}
      static Register register;
    };
  template<typename tsk, int groupId> Register Register::register;
    stuct printtask : task {
      enum { taskId = 1 };
      int getTaskId() { return taskId; }
      std::ostream printer;
    };
}

namespace AA { 
   enum { groupId = 2222 };
   
   struct line;
   struct rect;
   
   struct visitor
   {
      vitual void visit (const line&);
      void visit (const rect&);
   };
   
   struct figure : lib::object
   {
      enum { groupId = AA::groupId };
      virtual int  group_id () const { return groupId; }  
      virtual void accept (visitor & v)  = 0;      
   };
   
   struct printreg : Register<lib::printtask,groupId>, visitor
   {
     virtual void doApply(lib::printtask& _pt, lib::object&) {
       pt = &_pt;
       dynamic_cast<figure const&>(obj).accept(this);
     }
     void visit (const line&) { pt->printer << "AA::line "; }
     void visit (const rect&) { pt->printer << "AA::rect "; }            
   private:
     printtask* pt;
   };

   struct line : figure
   {
      virtual void accept (visitor& v) { v.visit(*this); }
   };
   
   struct rect : figure
   {
      virtual void accept (visitor& v) { v.visit(*this); }
   };
}


PM   Вверх
mes
Дата 12.11.2011, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(azesmcar @  11.11.2011,  08:50 Найти цитируемый пост)
если разделить функции по сущностям, тогда каждая сущность будет иметь свою функцию копирования, пусть в Вашем примере она не будет засорять интерфейс основного класса, но тем не менее она привязана к сущности, а значит для изменения конкретной функции для всех сущностей, придется менять все классы

вот пример того, о чем я говорил изначально :
http://liveworkspace.org/code/e04fcdd67b04...047a56795ec837a
или так :
http://liveworkspace.org/code/ff77f7b542c5...9f12ab7392a4504


Это сообщение отредактировал(а) mes - 12.11.2011, 16:26


--------------------
PM MAIL WWW   Вверх
mes
Дата 12.11.2011, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



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


Это сообщение отредактировал(а) mes - 12.11.2011, 15:46


--------------------
PM MAIL WWW   Вверх
math64
Дата 12.11.2011, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



mes, Ваш пример делает одно действие - print - причём только в cout.
Мой пример (он - модификация Вашего примера, и в нём есть ошибки, но их можно исправить) позволяет делать несколько действий с группой объектов.
Подключать/отключать группу ещё проще - не нужен init(), регистрация происходит автоматически при подключения модуля к проекту.

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


любитель
****


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

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



Цитата(math64 @  12.11.2011,  17:35 Найти цитируемый пост)
Ваш пример делает одно действие - print - причём только в cout.

может потому что акцент (моей) задачи стоял не нем ?  smile 
а пока что смотрю, что получается в каком случае.. и жду более подробного освещения проблем от тс..
тот пример лишь был показательным эксперементом  для group_id и не  очень оправдавшим себя.. сейчас я склоняюсь к другому smile


Цитата(math64 @  12.11.2011,  17:35 Найти цитируемый пост)
Подключать/отключать группу ещё проще - не нужен init(), 

уточню, я на ините и не настаивал.. 


Это сообщение отредактировал(а) mes - 12.11.2011, 19:54


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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



Вот есть ещё такая идея  (незавершённая) - в class Visitor новые методы не добавить, а в namespace - можно
Код

namespace lib {
struct printer;
}
namespace AA {
struct rect;
} 
namespace vistors {
void visit(const AA::rect&, lib::printer&);
}
namespace AA {
struct rect { void accept(lib::printer& p) { visitors::visit(*this, p); }
} 
namespace BB {
struct rect;
} 
namespace vistors {
void visit(const BB::rect&, lib::printer&);
}
namespace BB {
struct rect { void accept(printer& p) { visitors::visit(*this, p); }
}

Регистрация состоит в том, чтобы обеспечить включение всех нужных заголовков.

PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0642 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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