Привет всем!
У меня есть класс UI, который отвечает за UI и один из его элементов - кнопка.
Так же есть класс Controller, который содержит публичный метод bool Trade(void)
Этот метод вызывается при одном из событий:
1) нажата клавиша space;
2) при нажатии на кнопку UI. Этот метод привязан к кнопке, как callback.
До недавнего времени всё компилировалось и работает без косяков. Но недавно пришлось кое-что изменить и код уже не компилируется.
Сейчас появляется ошибка: "pointer to methods are not supported".
Вычитал, что можно использовать либо статик-функции, либо глобальные. Всё сломалось, короче говоря. Не хотелось бы переписывать под глобальный стек
либо функтор (класс который можно использовать почти как функцию)..но тоже кривовато, для разных колбеков придётся порождать по классу
class Functor {
public:
virtual bool invoke()=0;
}
class FunctorTrade:public Functor {
Controller * const pcnt;
FunctorTrade(const Controller &cnt):Functor() {
pcnt=&cnt;
}
bool invoke() { return pcnt.Trade() }
}
и если уж делать несколько классов, то вместо метода Trade() можно (даже лучше, красивше, академичней) сделать класс Action(общий для всех действий) и порождённый от него ActionTrade и уже его отдавать вместо функции-колбека
До недавнего времени всё компилировалось и работает без косяков. Но недавно пришлось кое-что изменить и код уже не компилируется.
Сейчас появляется ошибка: "pointer to methods are not supported".
Вычитал, что можно использовать либо статик-функции, либо глобальные. Всё сломалось, короче говоря. Не хотелось бы переписывать под глобальный стек
Куда-то целый пост отмадератился (в смысле что был написан, опубликован, проверен, но пропал)
придётся повторить
и если уж делать несколько классов, то вместо метода Trade() можно (даже лучше, красивше, академичней) сделать класс Action(общий для всех действий) и порождённый от него ActionTrade и уже его отдавать вместо функции-колбека
вот так вот примерно :
class UI; class Controller; class ControllerAction { private: Controller *owner; public: ControllerAction(Controller &cnt) { owner=&cnt; } ControllerAction(const ControllerAction &orig):owner(orig.owner) { } ~ControllerAction() { } virtual ControllerAction *clone() { return new ControllerAction(this); } virtual bool allowed() { return (CheckPointer(owner)!=POINTER_INVALID && owner!=NULL); } virtual bool invoke() { if (!allowed()) return false; Print("invokes"); return true; } }; class Controller { public: class ActionTrade : public ControllerAction { public: ActionTrade(Controller &cnt):ControllerAction(cnt) { } ActionTrade(const ActionTrade &orig):ControllerAction(orig) { } ControllerAction *clone() { return new ActionTrade(this); } bool invoke() { // OrderSend .... Print("ActionTrade"); return true; } }; class ActionClose : public ControllerAction { public: ActionClose(Controller &cnt):ControllerAction(cnt) { } ActionClose(const ActionClose &orig):ControllerAction(orig) { } ControllerAction *clone() { return new ActionClose(this); } bool invoke() { // CloseAll .... Print("ActionClose"); return true; } }; Controller(UI &ui) { ui.setAction(ActionTrade(this)); } }; class UI { public: ControllerAction *act1; UI():act1(NULL) { } ~UI() { delete act1; } void setAction(ControllerAction &act) { act1=act.clone(); } void DoAction() { if (act1==NULL) { Alert("internal logic error"); return; } if (!act1.allowed()) { Alert("action not allowed in this moment"); return; } act1.invoke(); } }; void OnStart() { UI ui; Controller cnt(ui); ui.DoAction(); }
то есть в контроллере вместо методов Trade(), Close() и прочих - вложенные классы ActionTrade, ActionClose
и их инстнцы отдаются наружу вместо колбеков
В этой части ничего не менялось (кроме вашего кода), и сообщение об ошибке древнее - происходит она потому, что в SetFooTrade() передается метод Trade() объекта (о чем на чистом аглицком языке и сообщается - "pointer to methods are not supported"), и правильное уточнение, что в typedef-е доступны только указатели на глобальные функции или статические - что-то одно из них и было в вашем коде до его модификации.
Куда-то целый пост отмадератился (в смысле что был написан, опубликован, проверен, но пропал)
придётся повторить
вот так вот примерно :
то есть в контроллере вместо методов Trade(), Close() и прочих - вложенные классы ActionTrade, ActionClose
и их инстнцы отдаются наружу вместо колбеков
В том то и дело, что я открыл исходники готового рабочего проекта, попытался скомпилировать и словил эту ошибку. То есть ни строчки не вносил, а лишь появилась необходимость доработать. Но застакался на этом
В исходном посте было сказано, дословно - "недавно пришлось кое-что изменить и код уже не компилируется" - неувязочка какая-то.
Указатели на методы объекта никогда не работали в MQL5. Всегда выдавалось это сообщение об ошибке.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Привет всем!
У меня есть класс UI, который отвечает за UI и один из его элементов - кнопка.
Так же есть класс Controller, который содержит публичный метод bool Trade(void)
Этот метод вызывается при одном из событий:
1) нажата клавиша space;
2) при нажатии на кнопку UI. Этот метод привязан к кнопке, как callback.
До недавнего времени всё компилировалось и работает без косяков. Но недавно пришлось кое-что изменить и код уже не компилируется.
Сейчас появляется ошибка: "pointer to methods are not supported".
Вычитал, что можно использовать либо статик-функции, либо глобальные. Всё сломалось, короче говоря. Не хотелось бы переписывать под глобальный стек