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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Трюк, возможно ли это? 
:(
    Опции темы
mes
Дата 6.9.2008, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(vaddsm @  6.9.2008,  23:39 Найти цитируемый пост)
  TOOL_TABLE_BEGIN
  
  DO_ACTION(Method1, Method2,)
  DO_ACTION(Method3, Method2,)
  TOOL_TABLE_END



Код

class IAction
{
  public:
  virtual void  Method1() {}
  virtual void  Method2() {}
  virtual void  Method3() {}
  virtual  IAction() {}
}

#define TOOL_TABLE_BEGIN(Class) class CAction : public IAction { Class p_obj; public: CAction(Class *p) : p_obj (p) {};                                                                            
#define DO_ACTION(Method1, Method2) void Method1() { p_obj->Method2(); }
#define TOOL_TABLE_END } m_Action;
#define INIT_TABLE m_Action(this)
#define INIT_TABLE_(Class) Class() :m_Action(this) {}


Код

Class ExampleCalss
{
  protected:
   int any_var1;
   int any_var2;
   int any_var3;
  public:
  void Method1();
  void Method2();
  void Method3();
  TOOL_TABLE_BEGIN(ExampleCalss)
  
  DO_ACTION(Method1, Method2)
  DO_ACTION(Method3, Method2)
  TOOL_TABLE_END
  ExampleCalss(int a): INIT_TABLE {} // инициализация внутри конструктора

  INIT_TABLE_(ExampleCalss)  //инициализация с добавлением конструктора по умолчанию.

   ~ExampleCalss();
};



Это сообщение отредактировал(а) mes - 7.9.2008, 00:01


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


Шустрый
*


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

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



Lazin, не то, не правильно Вам прояснил суть mes. Прочитайте мой последний пост, может, станет яснее. Дело в том что мой “инструмент” пользователь будет применять к своему MyClass, а как он у него объявлен, от какого класса унаследован, это сугубо его дело и я не хочу его как либо в этом ограничивать.
PM MAIL   Вверх
mes
Дата 7.9.2008, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



в Борланде Вы можете кстати описать указатель на метод  с помощью __closure и на этом построить таблицу 

Это сообщение отредактировал(а) mes - 7.9.2008, 00:12


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


Шустрый
*


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

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



Ван, момент, дайте дочитаю mes'a , пока не псте сообщений!
PM MAIL   Вверх
mes
Дата 7.9.2008, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(vaddsm @  7.9.2008,  00:00 Найти цитируемый пост)
Дело в том что мой “инструмент” пользователь будет применять к своему MyClass, а как он у него объявлен, от какого класса унаследован, это сугубо его дело и я не хочу его как либо в этом ограничивать

То есть Вы хотите чтоб любой пользовательский класс мог легко использовать свое тело для Библиотечного интерфейса.
Процесс передачи реализации интерфейсу называется делегацией. 
Вы хотите своими макросами(или другими способами) упростить делегацию. Правильно ?
помимо прямой делегации упомянутой в предыдущих примерах можно например использовать борландскую __closure, бустовые сигналы,
библиотеку FastDelegate (http://www.rsdn.ru/article/cpp/fastdelegate.xml) , или Winnie.Closure (http://dobrokot.nm.ru/cpp/CppMethodsCallback.html)




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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(vaddsm @  7.9.2008,  00:00 Найти цитируемый пост)
Прочитайте мой последний пост, может, станет яснее. Дело в том что мой “инструмент” пользователь будет применять к своему MyClass, а как он у него объявлен, от какого класса унаследован, это сугубо его дело и я не хочу его как либо в этом ограничивать. 

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

Добавлено через 12 секунд
объекта
PM MAIL Skype GTalk   Вверх
vaddsm
Дата 7.9.2008, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

То есть Вы хотите чтоб любой пользовательский класс мог легко использовать свое тело для Библиотечного интерфейса.


Да.

Цитата

Вы хотите своими макросами(или другими способами) упростить делегацию. Правильно ?


Нет, речь не идет о делегации, вовсе. Там совершенно другие задачи. Мой макрос:

Код

#define REPLACE_INALLINST_METHOD(lpOriginlMethod, CallType, lpDstMethod, lpInheritedMethod) \
MSL.ReplaceMethod(CallType, SPLICE_ALL,                                           \
&lpOriginlMethod, &lpDstMethod, &lpInheritedMethod);


Работает с адресами любых методов. Да и причем здесь методы, буть тут хоть переменные, члены класса, не важно! 
MSL.ReplaceMethod может оставаться черным ящиком, в рамках, задачи. 

Предложеный вами метод, всеьма изящен, хоть и не помогает решить задачу о которой я говорю. Опять ведь приходиться таскать за собой  ExampleCalss(int a): INIT_TABLE {} или  INIT_TABLE_(ExampleCalss). Было бы класно, если после слова TOOL_TABLE_END, пользователь мог забыть, о том, что от него что-то требуется еще.

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


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


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

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



Цитата(vaddsm @  7.9.2008,  00:33 Найти цитируемый пост)
пять ведь приходиться таскать за собой  ExampleCalss(int a): INIT_TABLE {} или  INIT_TABLE_(ExampleCalss). 

ага, я  уже писал smile
Цитата(mes @  6.9.2008,  19:51 Найти цитируемый пост)
ИМХО, решить задачу, не затрагивая конструктора, нереально. 

Я лишь привел пример организации таблицы, который не компилится если забыли проинициализоровать.

Добавлено @ 00:50
Цитата(vaddsm @  7.9.2008,  00:33 Найти цитируемый пост)
Работает с адресами любых методов. 

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

#define INITIATOR(Class) class Initiator { public: Initiator (Class *p) { p->Init(); } } m_Initiator;
если этот макрос спрятать в макросах описания таблицы, то пользователь не сможет забыть проинициализировать вашу таблицу



Это сообщение отредактировал(а) mes - 7.9.2008, 01:00


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


Шустрый
*


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

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



Mes, да все верно, Ваш пример отлично решит задачу о целостности конструкции, назавем ее так. Еще раз отмечу, что мне ооочень понравилось. Но я пока еще хочу поломать голову над тем, чтобы эту самую конструкцию окончить на слове TOOL_TABLE_END. Спасибо, за помощь! Плюс пока не могу поставить (постов мало).  

Если у кого будут идеи в сторону "непрописывания" кода в конструктор, я буду рад!
PM MAIL   Вверх
mes
Дата 7.9.2008, 01:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



а как библиотека использует TMethodSpliceInterface ?
Он автоматически регистрируется при создании, или это делается внешней функцией?


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


Шустрый
*


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

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



Код

#define MSL_TABLE_BEGIN TMethodSpliceInterface MSL;    


Экземпляр такого объекта создается при инициализации в памяти экземпляра класса над которым мы собираемся производить действия. 

Это сообщение отредактировал(а) vaddsm - 7.9.2008, 02:13
PM MAIL   Вверх
mes
Дата 7.9.2008, 02:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(vaddsm @  7.9.2008,  02:11 Найти цитируемый пост)
Экземпляр такого объекта создается при инициализации в памяти экземпляра класса над которым мы собираемся производить действия. 

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


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


Шустрый
*


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

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



Пускай вас не смущает присутствие в название слова Interface, на самом деле это не абстрактный класс. Это обычный класс содержащий несколько методов, в задачу которого входит принять передоваемые параметры, обработать их и передать в нужном формате на вход внешней функции описаной в lib. Вообщем класс это "обычный", нет нигде он не регистрируется.

Это сообщение отредактировал(а) vaddsm - 7.9.2008, 02:38
PM MAIL   Вверх
mes
Дата 7.9.2008, 02:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(vaddsm @  7.9.2008,  02:37 Найти цитируемый пост)
Пускай вас не смущает присутствие в название слова Interface, на самом деле это не абстрактный класс. Это обычный класс содержащий несколько методов, в задачу которого входит принять передоваемые параметры, обработать их и передать в нужном формате на вход внешней функции описаной в lib. Вообщем класс это обычный, нет нигде он не регистрируется. 


Нисколько не пугает название этого слова. Вопрос как происходит вызов нужного метода этого класса ?
ну, например, есть такое:
Код

class Class1 { private: TMethodSpliceInterface MSL;  ... } myObj;

кто, когда и как получает указатель на MSL ?

Это сообщение отредактировал(а) mes - 7.9.2008, 02:56


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


Шустрый
*


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

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



Я же написал TMethodSpliceInterface - не абстрактный класс. А вызов его методов осуществляется:

Код

class TClass1
{

 public:

 TMethodSpliceInterface MSL;

 void CallFuntion()
 {

  MSL.Method1(...);
  MSL.Method2(...);
  MSL.Method3(...);
  MSL.Method4(...);

 }

 TClass1()
 {
  CallFuntion();
 }

}


И только. На этом область применения его оканчивается.
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.0572 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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