Ошибка "ambiguous call to overloaded function" для виртуальных функций - почему ? - страница 2
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
В этом же и состоит суть позднего связывания, что нужная функция выбирается не компилятором, на этапе сборки программы, а во время работы программы, в момент создания объекта.
TheXpert:
Угу, только этот механизм работает совсем не так, как вы его хотели задействовать.
Понял. :)
А подскажите, может есть на MQL5 уже готовая реализация паттерна Visitor ? Чтобы не изобретать мне велосипед ?
А подскажите, может есть на MQL5 уже готовая реализация паттерна Visitor ? Чтобы не изобретать мне велосипед ?
Не припомню.
Привыкайте к тому, что хороший код чуть сложнее базового здесь можно увидеть не часто. А идеология стандартной библиотеки имеет очень мало общего с идеологией оной в С++.
Но помочь скорее всего помогут :)
Разобрался !!!
Полиморфизм работает, и виртуальные функции - тоже.
sergeev, ilunga, TheXpert, еще раз всем вам огромное спасибо за указание на мои ошибки.
TheXpert:Привыкайте к тому, что хороший код чуть сложнее базового здесь можно увидеть не часто.
Неудача. :-)
Мне казалось, что "шаблоны проектирования" - это ведь как раз базовый код... И насчет идеологии Стандартной Библиотеки - мне показалось, что она довольно близка к идеологии MFC.
Ну так вот, чтобы хорошего кода чуть сложнее базового было здесь побольше, выкладываю простейшую реализацию паттерна Visitor на MQL:
/+------------------------------------------------------------------+
//| Visitor.mqh |
//| Copyright 2012, MetaQuotes Software Corp. |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link "http://www.mql5.com"
class Wheel;
class Engine;
class CCarElementVisitor
{
public:
virtual void Visit(Wheel* wheel) {};
virtual void Visit(Engine* engine) {};
};
class CCarElement
{
public:
virtual void Accept(CCarElementVisitor* visitor) {};
};
class Wheel : public CCarElement
{
public:
virtual void Accept(CCarElementVisitor* visitor) { visitor.Visit(GetPointer(this)); };
};
class Engine : public CCarElement
{
public:
virtual void Accept(CCarElementVisitor* visitor) { visitor.Visit(GetPointer(this)); };
};
class CCarElementPrintVisitor : CCarElementVisitor
{
public:
virtual void Visit(Wheel* wheel) { Print("wheel"); };
virtual void Visit(Engine* engine) { Print("engine"); };
};
class CPrintCarTest
{
public:
void TestVisitor()
{
CCarElement* elements[2];
CCarElementPrintVisitor visitor;
CCarElement* pCurrentElement;
elements[0] = new Engine;
elements[1] = new Wheel;
for(int i=0; i<2; ++i)
{
pCurrentElement = elements[i];
pCurrentElement.Accept(GetPointer(visitor));
delete(elements[i]);
};
};
Остается подумать, как употребить Визитора для работы с классами индикаторов и таймсерий Стандартной библиотеки.
В отличие от MSVC необходимо, чтобы функция Accept была явно объявлена в каждом классе-потомке. Если MSVC берет функцию Accept предка, но при передаче ей указателя на потомка оставляет все функции самого потомка, то в MQL необходимо, чтобы потомок сам обладал нужной функцией - и тогда будет вызвана именно она.
Yedelkin:
Если считаете код стОящим, выкладывать лучше здесь: Code Base На форуме он быстро затеряется.
Подождем отзывов. Если общественность посчитает это целесообразным - думаю, так и надо сделать.
Подождем отзывов. Если общественность посчитает это целесообразным - думаю, так и надо сделать.
Паттерны вещь полезная.
Может тогда лучше кому-нибудь заняться этим?
Переписать на mql самые распространенные паттерны, оформить статьей и в конце приложить коды?
Паттерны вещь полезная.
Может тогда лучше кому-нибудь заняться этим?
Переписать на mql самые распространенные паттерны, оформить статьей и в конце приложить коды?
Это намек на меня ? :-)
К сожалению, я начинающий трейдер, и в MQL опыта не имею - только изучаю вот, кодируя своего первого советника (и до этого сделал пару индикаторов). Соответственно, никакой уверенности в своем коде пока нет. (Вон, получается задал довольно глупый вопрос, полагая, что концепция виртуальных функций в MQL - калька с MSVC. У меня имеется некоторый опыт работы в MSVC на С++, что и предопределило знакомство с некоторыми паттернами.
В данный момент моя цель - написать структуру классов, которые бы представляли таймсерии и индикаторы, и имели универсальный механизм включения в советника. А то получается, что одни индикаторы - имеют одну функцию вывода, другие - другую, хотя, входной параметр - везде номер бара, а выходной - величина типа double. Методика инициализации у них тоже достаточно однообразна. В результате мне надоело, что, скажем, добавляя в советника таймсерию СiOpen - требуется добавлять совершенно стандартный код инициализации и получения данных. Поэтому, появилось желание как-то автоматизировать данный процесс - понадобился новый индикатор - вбил в код советника несколько строчек кода - и индикатор вместе с инициализацией и механизмом получения данных готов. На мой взгляд, Визитор - очень даже полезный паттерн для этой задачи.
Получится ли ? Не знаю. Получится - выложу на суд форумчан. Вот тогда и займусь написанием статьи, по крайней мере, про визитор. А там поглядим - может быть, по мере написания кода и про другие паттерны тоже.
Похоже на правду :)
Может тогда лучше кому-нибудь заняться этим?
Практически бессмысленно -- очень маленькая целевая аудитория.
Здесь по сути наверное даже большая часть кодеров из топа исполнителей в "работе" не профессионалы.
Чеку вырвал, гранату бросил :) ну держись :)