Здравствуйте, sof.bix, Вы писали:
SB>Можно тупой вопрос совершенно?
SB>Вот хочу виртуальный метод экземпляра класса передавать как переменную. SB>Предусмотренно это стандартом С++ ? И какими средствами?
Вариантов несколько: Можно передвавать указатель на метод класса в паре с указателем на объект (но синтаксис жутковатый, и будет работать только для фиксированного класса)
Как выше, но тип класса параметезировать через темплейт
Классический ООП вариант "слушателя": class IMouseListener{public: virtual void onMouseMove()=0; /*...*/}
boost::function — как 2 но гораздо удобнее
Сигналы/слоты (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, Вы писали:
SB>>Вот хочу виртуальный метод экземпляра класса передавать как переменную. SB>>Предусмотренно это стандартом С++ ? И какими средствами?
TB>Сформулировано несколько туманно. Указатель на член класса подойдет? Операторы '::*', '.*', '->*'.
О интересно, для чего эти операторы могут пригодиться кстати?
Мне нужен аналог evant (события) C# или линейки Borland.
То есть например есть объект некоторого класса, я хотел бы его нестатический метод передать в качестве параметра другому объету. Весь объект ему не нужен, ему нужен только его виртуальный метод.
Я почему задаю такой вопрос, мне интересно насколько С++ объекты "истенны" в рамках ООП
Re[2]: явоские слушатели или делфийские события с СЯХ
Здравствуйте, Zigmar, Вы писали:
Z>Здравствуйте, sof.bix, Вы писали:
SB>>Можно тупой вопрос совершенно?
SB>>Вот хочу виртуальный метод экземпляра класса передавать как переменную. SB>>Предусмотренно это стандартом С++ ? И какими средствами?
Z>Вариантов несколько: Z> Z>Можно передвавать указатель на метод класса в паре с указателем на объект (но синтаксис жутковатый, и будет работать только для фиксированного класса) Z>Как выше, но тип класса параметезировать через темплейт Z>Классический ООП вариант "слушателя": class IMouseListener{public: virtual void onMouseMove()=0; /*...*/} Z>boost::function — как 2 но гораздо удобнее Z>Сигналы/слоты (boost::signals, Qt signals & slots, etc) Z>
да, это оно, насчет сигналов и слотов можете описать подробнее, они тоже за основу берут 2 ?
Re[3]: явоские слушатели или делфийские события с СЯХ
Здравствуйте, 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]: явоские слушатели или делфийские события с СЯХ
SB>То есть например есть объект некоторого класса, я хотел бы его нестатический метод передать в качестве параметра другому объету. Весь объект ему не нужен, ему нужен только его виртуальный метод.
Любому нестатическому методу передается неявный дополнительный параметр this. Поэтому для вызова метода по указателю ::* необходим указатель или ссылка на объект. Вот примеры.
Re: явоские слушатели или делфийские события с СЯХ
Здравствуйте, sof.bix, Вы писали:
SB>Можно тупой вопрос совершенно?
SB>Вот хочу виртуальный метод экземпляра класса передавать как переменную. SB>Предусмотренно это стандартом С++ ? И какими средствами?
SB>О интересно, для чего эти операторы могут пригодиться кстати? SB>Мне нужен аналог evant (события) C# или линейки Borland. SB>То есть например есть объект некоторого класса, я хотел бы его нестатический метод передать в качестве параметра другому объету. Весь объект ему не нужен, ему нужен только его виртуальный метод.
SB>Я почему задаю такой вопрос, мне интересно насколько С++ объекты "истенны" в рамках ООП
понимаете ли, нестатический метод определен на экземпляре класса, и потому всегда имеет скрытый параметр — указатель на конкретный экземпляр класса. передавать такой метод куда-то и потом вызвать его без указателя на КОНКРЕТНЫЙ экземпляр, такое просто невозможно реализовать в компиляторе. то есть хитрых ходов и уловок нет и быть не может. аналогично нет уловок чтобы обычную функцию с одним параметром, вызывать как функцию без параметров. не подставить параметр по умолчанию, а просто не дать в качестве параметра ничего.