явоские слушатели или делфийские события с СЯХ
От: sof.bix Россия http://byterix.net
Дата: 16.06.08 11:13
Оценка:
Можно тупой вопрос совершенно?

Вот хочу виртуальный метод экземпляра класса передавать как переменную.
Предусмотренно это стандартом С++ ? И какими средствами?
Re: явоские слушатели или делфийские события с СЯХ
От: Zigmar Израиль  
Дата: 16.06.08 11:37
Оценка: 2 (1)
Здравствуйте, sof.bix, Вы писали:

SB>Можно тупой вопрос совершенно?


SB>Вот хочу виртуальный метод экземпляра класса передавать как переменную.

SB>Предусмотренно это стандартом С++ ? И какими средствами?


Вариантов несколько:
  1. Можно передвавать указатель на метод класса в паре с указателем на объект (но синтаксис жутковатый, и будет работать только для фиксированного класса)
  2. Как выше, но тип класса параметезировать через темплейт
  3. Классический ООП вариант "слушателя": class IMouseListener{public: virtual void onMouseMove()=0; /*...*/}
  4. boost::function — как 2 но гораздо удобнее
  5. Сигналы/слоты (boost::signals, Qt signals & slots, etc)
"To protect people you must slay people. To let people live you must let people die. This is the true teaching of the sword."
-Seijuro Hiko, "Rurouni Kensin"
Re: явоские слушатели или делфийские события с СЯХ
От: TheBeard Россия  
Дата: 16.06.08 11:39
Оценка: 1 (1)
SB>Вот хочу виртуальный метод экземпляра класса передавать как переменную.
SB>Предусмотренно это стандартом С++ ? И какими средствами?

Сформулировано несколько туманно. Указатель на член класса подойдет? Операторы '::*', '.*', '->*'.
Re[2]: явоские слушатели или делфийские события с СЯХ
От: sof.bix Россия http://byterix.net
Дата: 16.06.08 12:37
Оценка:
Здравствуйте, TheBeard, Вы писали:

SB>>Вот хочу виртуальный метод экземпляра класса передавать как переменную.

SB>>Предусмотренно это стандартом С++ ? И какими средствами?

TB>Сформулировано несколько туманно. Указатель на член класса подойдет? Операторы '::*', '.*', '->*'.


О интересно, для чего эти операторы могут пригодиться кстати?
Мне нужен аналог evant (события) C# или линейки Borland.
То есть например есть объект некоторого класса, я хотел бы его нестатический метод передать в качестве параметра другому объету. Весь объект ему не нужен, ему нужен только его виртуальный метод.

Я почему задаю такой вопрос, мне интересно насколько С++ объекты "истенны" в рамках ООП
Re[2]: явоские слушатели или делфийские события с СЯХ
От: sof.bix Россия http://byterix.net
Дата: 16.06.08 12:44
Оценка:
Здравствуйте, Zigmar, Вы писали:

Z>Здравствуйте, sof.bix, Вы писали:


SB>>Можно тупой вопрос совершенно?


SB>>Вот хочу виртуальный метод экземпляра класса передавать как переменную.

SB>>Предусмотренно это стандартом С++ ? И какими средствами?


Z>Вариантов несколько:

Z>

    Z>
  1. Можно передвавать указатель на метод класса в паре с указателем на объект (но синтаксис жутковатый, и будет работать только для фиксированного класса)
    Z>
  2. Как выше, но тип класса параметезировать через темплейт
    Z>
  3. Классический ООП вариант "слушателя": class IMouseListener{public: virtual void onMouseMove()=0; /*...*/}
    Z>
  4. boost::function — как 2 но гораздо удобнее
    Z>
  5. Сигналы/слоты (boost::signals, Qt signals & slots, etc)
    Z>

да, это оно, насчет сигналов и слотов можете описать подробнее, они тоже за основу берут 2 ?
Re[3]: явоские слушатели или делфийские события с СЯХ
От: Alexander G Украина  
Дата: 16.06.08 13:22
Оценка: 2 (1)
Здравствуйте, sof.bix, Вы писали:

SB>да, это оно, насчет сигналов и слотов можете описать подробнее, они тоже за основу берут 2 ?


boost::signal берут за основу boost::function, которые в свою очередь берут за основу 2.

Я раньше писал на Delphi, для меня сейчас ближайший аналог события Delphi — это всё же boost::function :
1. На них можно назначить только один метод или NULL, как в Delphi.
2. При вызове, если событие может быть NULL, напо проверять If (myEvent_) myEvent_(Parameter), иначе вызов приведёт к исключению, как в Delphi.
3. Они потокобезопсны и достаточно легковесны.

Но при этом ситуация лучше чем в Delphi тем что:
1. Не требуется от обработчика точной сигнатуры — bind'ом можно добавить в метод свои параметры, переставить параметры события и проигнорировать параметры события. Можно записать в переменную типа boost::function как указатель на класс-обратотчик, так и сам класс-обработчик, то же касается дополнительных параметорв.
2. Событие инициализируется в NULL всегда, а не только когда является полем класса.
Русский военный корабль идёт ко дну!
Re[3]: явоские слушатели или делфийские события с СЯХ
От: TheBeard Россия  
Дата: 16.06.08 16:12
Оценка:
SB>То есть например есть объект некоторого класса, я хотел бы его нестатический метод передать в качестве параметра другому объету. Весь объект ему не нужен, ему нужен только его виртуальный метод.

Любому нестатическому методу передается неявный дополнительный параметр this. Поэтому для вызова метода по указателю ::* необходим указатель или ссылка на объект. Вот примеры.
Re: явоские слушатели или делфийские события с СЯХ
От: c-smile Канада http://terrainformatica.com
Дата: 16.06.08 16:27
Оценка: 3 (1)
Здравствуйте, sof.bix, Вы писали:

SB>Можно тупой вопрос совершенно?


SB>Вот хочу виртуальный метод экземпляра класса передавать как переменную.

SB>Предусмотренно это стандартом С++ ? И какими средствами?

Signal and Slots
http://sigslot.sourceforge.net/

В средах с низким порогом вхождения известно как delegates.

SB>И какими средствами?


В основе всего лежит структура с двумя полями:

struct delegate 
{
  object*   pobj;
  function* pmethod;
}
Re[3]: явоские слушатели или делфийские события с СЯХ
От: merk Россия  
Дата: 17.06.08 00:30
Оценка: +1
SB>О интересно, для чего эти операторы могут пригодиться кстати?
SB>Мне нужен аналог evant (события) C# или линейки Borland.
SB>То есть например есть объект некоторого класса, я хотел бы его нестатический метод передать в качестве параметра другому объету. Весь объект ему не нужен, ему нужен только его виртуальный метод.

SB>Я почему задаю такой вопрос, мне интересно насколько С++ объекты "истенны" в рамках ООП


понимаете ли, нестатический метод определен на экземпляре класса, и потому всегда имеет скрытый параметр — указатель на конкретный экземпляр класса. передавать такой метод куда-то и потом вызвать его без указателя на КОНКРЕТНЫЙ экземпляр, такое просто невозможно реализовать в компиляторе. то есть хитрых ходов и уловок нет и быть не может. аналогично нет уловок чтобы обычную функцию с одним параметром, вызывать как функцию без параметров. не подставить параметр по умолчанию, а просто не дать в качестве параметра ничего.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.