Ошибка "ambiguous call to overloaded function" для виртуальных функций - почему ? - страница 2

 
Laryx:

В этом же и состоит суть позднего связывания, что нужная функция выбирается не компилятором, на этапе сборки программы, а во время работы программы, в момент создания объекта.

Угу, только этот механизм работает совсем не так, как вы его хотели задействовать.
 

TheXpert:
Угу, только этот механизм работает совсем не так, как вы его хотели задействовать.

 

Понял. :)

А подскажите, может есть на MQL5 уже готовая реализация паттерна Visitor ? Чтобы не изобретать мне велосипед ?

 

 

 
Laryx:

А подскажите, может есть на MQL5 уже готовая реализация паттерна Visitor ? Чтобы не изобретать мне велосипед ?

Не припомню.

Привыкайте к тому, что хороший код чуть сложнее базового здесь можно увидеть не часто. А идеология стандартной библиотеки имеет очень мало общего с идеологией оной в С++.

Но помочь скорее всего помогут :)

Документация по MQL5: Стандартная библиотека
Документация по MQL5: Стандартная библиотека
  • www.mql5.com
Стандартная библиотека - Документация по MQL5
 

Разобрался !!!

Полиморфизм  работает, и виртуальные функции - тоже.

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 необходимо, чтобы потомок сам обладал нужной функцией - и тогда будет вызвана именно она. 

 
Laryx: выкладываю простейшую реализацию паттерна Visitor на MQL:
 Если считаете код стОящим, выкладывать лучше здесь: Code Base  На форуме он быстро затеряется.
 

Yedelkin:
 Если считаете код стОящим, выкладывать лучше здесь: Code Base  На форуме он быстро затеряется.

Подождем отзывов. Если общественность посчитает это целесообразным - думаю, так и надо сделать. 

 
Laryx:

Подождем отзывов. Если общественность посчитает это целесообразным - думаю, так и надо сделать. 

Паттерны вещь полезная.

Может тогда лучше кому-нибудь заняться этим?

Переписать на mql самые распространенные паттерны, оформить статьей и в конце приложить коды?

 
ilunga:

Паттерны вещь полезная.

Может тогда лучше кому-нибудь заняться этим?

Переписать на mql самые распространенные паттерны, оформить статьей и в конце приложить коды?

 

Это намек на меня ?  :-) 

К сожалению, я начинающий трейдер, и в MQL опыта не имею - только изучаю вот, кодируя своего первого советника (и до этого сделал пару индикаторов). Соответственно, никакой уверенности в своем коде пока нет. (Вон, получается задал довольно глупый вопрос, полагая, что концепция виртуальных функций в MQL - калька с MSVC. У меня имеется некоторый опыт работы в MSVC на С++, что и предопределило знакомство с некоторыми паттернами.

В данный момент моя цель - написать структуру классов, которые бы представляли таймсерии и индикаторы, и имели универсальный механизм включения в советника. А то получается, что одни индикаторы - имеют одну функцию вывода, другие - другую, хотя, входной параметр - везде номер бара, а выходной - величина типа double. Методика инициализации у них тоже достаточно однообразна. В результате мне надоело, что, скажем, добавляя в советника таймсерию СiOpen - требуется добавлять совершенно стандартный код инициализации и получения данных. Поэтому, появилось желание как-то автоматизировать данный процесс -  понадобился новый индикатор - вбил в код советника несколько строчек кода - и индикатор вместе с инициализацией и механизмом получения данных готов. На мой взгляд, Визитор - очень даже полезный паттерн для этой задачи.

Получится ли ? Не знаю.  Получится - выложу на суд форумчан. Вот тогда и займусь написанием статьи, по крайней мере, про визитор. А там поглядим - может быть, по мере написания кода и про другие паттерны тоже.  

Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Полиморфизм
Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Полиморфизм
  • www.mql5.com
Основы языка / Объектно-ориентированное программирование / Полиморфизм - Документация по MQL5
 
Laryx:

Похоже на правду :)

ilunga:

Может тогда лучше кому-нибудь заняться этим?

Практически бессмысленно -- очень маленькая целевая аудитория.

Здесь по сути наверное даже большая часть кодеров из топа исполнителей в "работе" не профессионалы.


 

Чеку вырвал, гранату бросил :)   ну держись :)