Обсуждение статьи "Графические интерфейсы XI: Интеграция графической стандартной библиотеки (build 16)" - страница 7

 
Pavel Kolchin:

попробовал изменить в файле ElementBase.mqh, ругается еще сильнее

И в ElementBase.mqh и в Element.mqh нужно менять

 
MetaQuotes Software Corp.:

В последних билдах мы добавили в компилятор сообщение для тех случаев, когда в потомке происходит перегрузка метода предка:

Пример

В данном случае в классе-потомке SBar происходит вызов функции func(int) предка SFoo, так как компилятор не нашел его в потомке.  В потомке есть только функция func(double), и компилятор пытается найти функцию с подходящим параметром в дереве наследования.

То есть компилятор MQL5 вместо переопределения метода в потомке производит перегрузку. В начале развития языка такое послабление компилятора MQL5 не считалось критическим. Но в будущем это может быть изменено, поэтому теперь выдается явное предупреждение,  чтобы разработчики программм на MQL5 приняли во внимание и исправили свои коды.

Строго говоря, переопределение немного более широкое понятие, вы можете сами поискать в интернете разницу между перегрузкой и переопределением

1. Правильно ли, что такой код не компилируется?

class CA
{
        public:
                void func( void ) { Print( __FUNCSIG__ ); };
};
 
class CB : CA
{
        public:
                //void func( void ) { CA::func(); };    // без этой строки не компилируется
};

class CC
{
        public:
                CB m_b;
                CC(void) { m_b.func(); }
};

void OnStart()
{       
        CC c;
}
'CA::func' - cannot access private member function      TestCompiler.mq5        27      18
   see declaration of 'CA::func'        TestCompiler.mq5        13      8
1 error(s), 0 warning(s)                2       1


2. Правильно ли, что вот такой код, помимо вышеупомянутой ошибки, выдает предупреждение "deprecated behavior, hidden method calling will be disabled in a future MQL compiler version TestCompiler.mq5 27 18"?

class CA
{
        public:
                void func( void ) { Print( __FUNCSIG__ ); };
};
 
class CB : CA
{
        public:
                //void func( void ) { CA::func(); };    // без этой строки не компилируется
                bool func( int a ) { return(true); };
};

class CC
{
        public:
                CB m_b;
                CC(void) { m_b.func(); }
};

void OnStart()
{       
        CC c;
}

 
Andrey Khatimlianskii:

1. Правильно ли, что такой код не компилируется?


2. Правильно ли, что вот такой код, помимо вышеупомянутой ошибки, выдает предупреждение "deprecated behavior, hidden method calling will be disabled in a future MQL compiler version TestCompiler.mq5 27 18"?


Может это лучше спросить в ветке про новую версию терминала? ) Думаю, там быстрее ответят )

Предупреждение вроде бы вписывается в новую логику компилятора, в вот про private member тоже не понял, все же public...

 
Oleksii Chepurnyi:

И в ElementBase.mqh и в Element.mqh нужно менять

в ElementBase.mqh понятно, вы заменили "Is" на "Set" (но не понятно почему мы можем это сделать)

virtual void      SetAvailable(const bool state)                  { m_is_available=state;                 }
bool              IsAvailable(void)                         const { return(m_is_available);               }

а в Element.mqh другая строчка

//--- Доступность элемента
virtual void      IsAvailable(const bool state);
 
Pavel Kolchin:

в ElementBase.mqh понятно, вы заменили "Is" на "Set" (но не понятно почему мы можем это сделать)

а в Element.mqh другая строчка

Ну не нравится сейчас MQ одинаковые имена (переменных, методов и тп) :)

Мы просто сменили имя метода (а почему нет? ) )

Не хочется ничего менять - ждем пока автор все переделает )

 
Oleksii Chepurnyi:

автор, вероятно, "закончил" с этим проектом, можете конкретнее указать в каких строчках что написать чтобы компилятор не ругался, а лучше конечно православные (исправленные) файлики ( ElementBase.mqh и в Element.mqh) для народа

 

1. Я сейчас занимаюсь другим проектом.

2. У меня очень сильно изменена библиотека )

Ну и кроме изменений в ElementBase.mqh и в Element.mqh нужно пройтись по всем элементам, может и там есть эти методы.

 
Oleksii Chepurnyi:

Может это лучше спросить в ветке про новую версию терминала? ) Думаю, там быстрее ответят )

Предупреждение вроде бы вписывается в новую логику компилятора, в вот про private member тоже не понял, все же public...

Нашел там обходной путь:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Новая версия платформы MetaTrader 4 build 1170

fxsaber, 2019.09.06 09:39

Считаю, что предложенный вариант в MT5 - нововведение, которое должно быть добавлено и в MT4.

Но если писать код по-старинке, то работать будет везде.

     void           Test(const bool test){((A)b).Test(test);}

Вот так мой пример работает:

CC(void) { ((CA)m_b).func(); }


Но это не выход, конечно.

 

@Ilyas, без приведения к CA нет варианта?

 
Andrey Khatimlianskii:

@Ilyas, без приведения к CA нет варианта?

1. у Вас наследование приватное

class CB : CA

2. правильное предупреждение, по правилам теперь так:

CC(void) { m_b.CA::func(); }