...
- www.mql5.com
- www.mql5.com
Renat:
Используйте виртуальные функции и соответствующую обьектную модель.
Забываете про ключевой посыл "Расскажите мне..." :D
Тут дело не в полиморфизме...
//ФАЙЛ ИНКЛУДА bool func(функция которую нужно применить ко всем графикам (ФКНПКВГ)) { long chartID_Begin = ChartFirst(); long chartID_End = ChartNext(chartID); while (chartID_End != -1) { ФКНПКВГ(chartID_Begin... ); chart_Begin = chartID_End; chartID_End = ChartNext(chartID_Begin); } return (true); } //ТЕЛО ОСНОВНОГО ФАЙЛА (вар. 1) void OnStart() { func(ChartClose(0)); } //ТЕЛО ОСНОВНОГО ФАЙЛА (вар. 2) void OnStart() { func(ChartApplyTemplate(0,template.tpl); }
т.е. в любом месте, где нам необходимо применить какую-либо функцию ко всем открытым графикам - мы инклудим файл с функцией func() и применяем свой код или функцию ко всем графикам без надобности в каждой новой программе воспроизводить код перехода по графикам... вроде бы объяснил =)
- 2010.03.25
- MetaQuotes Software Corp.
- www.mql5.com
Тут дело не в полиморфизме...
т.е. в любом месте, где нам необходимо применить какую-либо функцию ко всем открытым графикам - мы инклудим файл с функцией func() и применяем свой код или функцию ко всем графикам без надобности в каждой новой программе воспроизводить код перехода по графикам... вроде бы объяснил =)
Средствами MQL вы не сумеете передать указатель на функцию, зато вполне можете передать объект, инкапсулирующий нужное поведение в одном из своих полиморфных методов. Получится многословнее, но вашу задачу это решит.
Подробнее можно почитать у GoF, паттерн проектирования Action.
Либо я не допонял автора, либо пытаемся удалить миндалены галогеном через анус. Простите за лирику. :)
Не проще ли сделать две функции:
1. Цикл, перебирающий все чарты. При каждоый итерации управление передается второй функции с передачей аргумента идентификатора чарта.
2. Функция, получающая ИД чарта в качестве аргумента, возращающая успех/неудачу своего выполнения.
void BustAllChart(void) { for (...) ChartFunction(...); } bool ChartFunction(const long ChartID) { // some action... }
- www.mql5.com
Либо я не допонял автора, либо пытаемся удалить миндалены галогеном через анус. Простите за лирику. :)
Не проще ли сделать две функции:
1. Цикл, перебирающий все чарты. При каждоый итерации управление передается второй функции с передачей аргумента идентификатора чарта.
2. Функция, получающая ИД чарта в качестве аргумента, возращающая успех/неудачу своего выполнения.
Вся тема высосана из пальца. Перебор чартов пишется в одну строку:
for (long ID=ChartNext(0);ID!=-1;ID=ChartNext(ID)) { ФКНПКВГ(ID); }
если влом каждый раз прописывать такой фор, можно в макрос свернуть:
#define ForEachChart(ID) for(long ID=ChartNext(0);ID!=-1;ID=ChartNext(ID))
...
...
ForEachChart(ID) { ФКНПКВГ(ID); }
Средствами MQL вы не сумеете передать указатель на функцию, зато вполне можете передать объект, инкапсулирующий нужное поведение в одном из своих полиморфных методов. Получится многословнее, но вашу задачу это решит.
Подробнее можно почитать у GoF, паттерн проектирования Action.
Вот код для тех, кто не знает, как использовать паттерн Action вместо указателя на функцию.
// "include.mqh" class CAction { protected: virtual void doExecute() {return;} // внутренняя реализация public: void Execute() {doExecute();} // внешний интерфейс класса }; void CommonBehaviorFunction(CAction action) { // ...какие-то действия... if (action != null) action.Execute(); // ...какие-то действия... return; } //"example1.mq5" #include <include.mqh> class CExample1Action: public CAction { protected: virtual void doExecute() { ...какие-то действия... } // например, ChartClose(0); }; CExample1Action example1Action; void OnStart() { CommonBehaviorFunction(example1Action); } //"example2.mq5" #include <include.mqh> class CExample2Action: public CAction { protected: virtual void doExecute() { ...какие-то действия... } // например, ChartApplyTemplate(0,template.tpl); }; CExample2Action example2Action; void OnStart() { CommonBehaviorFunction(example2Action); }
Вот код для тех, кто не знает, как использовать паттерн Action вместо указателя на функцию.
"Лучший микроскоп для ваших гвоздей!" (це) я
;)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте уважаемые форумцы!
Расскажите мне, или давайте придумаем вместе некий механизм, посредством которого можно в функцию передать функцию! =)
Зачем передавать функцию, когда ее можно было бы вызвать при прямом обращении уже внутри другой функции? Затем, чтобы создать включаемый файл, который будет иметь ряд функций, допустим "применить ко всем открытым графикам" и заинклудив вызвать ее, передать ей функцию, допустим ChartClose или ObjectCreate, cоответственно с параметрами и уже в функции "применить ко всем открытым графикам" будет создаваться объект (соответственно до тех пор, пока ChartNext не выдаст -1) или закроются все открытые окна...
Понимаю, что впринципе реализовать подобное скорее всего невозможно, так как функцию в функции не передают, но вдруг посредством каких нибудь указателей можно сделать что то подобное... помоему можно очень гибко использовать подобный метод...