Diskussion zum Artikel "Grafische Interfaces XI: Integration der graphischen Standardbibliothek (build 16)" - Seite 8

 
Oleksii Chepurnyi:

Ich habe versucht, die Datei ElementBase.mqh zu ändern, aber sie schimpft noch mehr.

 
Pavel Kolchin:

Ich habe versucht, die Datei ElementBase.mqh zu ändern, aber sie schimpft noch mehr.

Sowohl ElementBase.mqh als auch Element.mqh müssen geändert werden.

 
MetaQuotes Software Corp.:

In den letzten Builds haben wir dem Compiler eine Meldung für die Fälle hinzugefügt, in denen eine Vorgängermethode in einem Nachkomme überladen wird:

Beispiel

In diesem Fall wird die Funktion func(int) des Vorfahren SFoo in der Nachfolgeklasse SBar aufgerufen, weil der Compiler sie in der Nachfolgeklasse nicht gefunden hat. Die Nachfolgeklasse hat nur die Funktion func(double) und der Compiler versucht, eine Funktion mit einem geeigneten Parameter im Vererbungsbaum zu finden.

Das heißt, der MQL5-Compiler führt eine Überladung durch, anstatt die Methode im Nachfahren zu überschreiben. Zu Beginn der Sprachentwicklung wurde diese Lockerung des MQL5-Compilers nicht als kritisch angesehen. Sie kann sich aber in der Zukunft ändern, so dass jetzt eine ausdrückliche Warnung an die Entwickler von MQL5-Programmen ausgegeben wird, um ihre Codes zu berücksichtigen und zu korrigieren.

Streng genommen ist Overriding ein etwas weiter gefasster Begriff, den Unterschied zwischen Overloading und Overriding können Sie im Internet unter
nachlesen.

1. Ist es richtig, dass solcher Code nicht kompiliert wird?

class CA
{
        public:
                void func( void ) { Print( __FUNCSIG__ ); };
};
 
class CB : CA
{
        public:
                //void func( void ) { CA::func(); }; }; // ohne diese Zeile wird es nicht kompiliert
};

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. Ist es richtig, dass dieser Code, zusätzlich zu dem oben erwähnten Fehler, die Warnung "deprecated behaviour, hidden method calling will be disabled in a future MQL compiler version TestCompiler.mq5 27 18" erzeugt?

class CA
{
        public:
                void func( void ) { Print( __FUNCSIG__ ); };
};
 
class CB : CA
{
        public:
                //void func( void ) { CA::func(); }; }; // ohne diese Zeile wird es nicht kompiliert
                bool func( int a ) { return(true); };
};

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

void OnStart()
{       
        CC c;
}

 
Andrey Khatimlianskii:

1. Ist es richtig, dass solcher Code nicht kompiliert wird?


2. Ist es richtig, dass dieser Code zusätzlich zu dem obigen Fehler die Warnung "deprecated behaviour, hidden method calling will be disabled in a future MQL compiler version TestCompiler.mq5 27 18" erzeugt?


Vielleicht ist es besser, diese Frage in dem Thread über die neue Version des Terminals zu stellen? ) Ich denke, sie werden dort schneller antworten.)

Die Warnung scheint in die neue Logik des Compilers zu passen, aber ich verstehe das mit dem privaten Mitglied nicht, es ist immer noch öffentlich...

 
Oleksii Chepurnyi:

Sowohl ElementBase.mqh als auch Element.mqh müssen geändert werden

In ElementBase.mqh ist es klar, dass Sie "Is" durch "Set" ersetzt haben (aber es ist nicht klar, warum wir das tun können).

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

aber in Element.mqh gibt es eine weitere Zeile

//--- Verfügbarkeit von Artikeln
virtual void      IsAvailable(const bool state);
 
Pavel Kolchin:

In ElementBase.mqh ist es klar, dass Sie "Is" durch "Set" ersetzt haben (aber es ist nicht klar, warum wir das tun können)

aber in Element.mqh gibt es eine weitere Zeile

Nun, MQ mag keine gleichen Namen (Variablen, Methoden, etc.) :)

Wir haben nur den Namen der Methode geändert (und warum nicht? ) ) )

Wir wollen nichts ändern - wir warten darauf, dass der Autor alles neu macht ) )

 
Oleksii Chepurnyi:

Der Autor ist wahrscheinlich "fertig" mit diesem Projekt, können Sie angeben, in welchen Zeilen, was zu schreiben, so dass der Compiler nicht fluchen, und besser natürlich orthodox (korrigiert) Dateien ( ElementBase.mqh und in Element.mqh) für die Menschen

 

1. Ich stecke gerade mitten in einem anderen Projekt.

2. Ich habe die Bibliothek sehr stark verändert )

Nun, neben den Änderungen in ElementBase.mqh und Element.mqh solltest du alle Elemente durchgehen, vielleicht gibt es diese Methoden auch dort.

 
Oleksii Chepurnyi:

Vielleicht ist es besser, in dem Thread über die neue Version des Terminals zu fragen? ) Ich denke, sie werden dort schneller antworten )

Die Warnung scheint in die neue Logik des Compilers zu passen, aber ich verstehe das mit dem privaten Mitglied nicht, es ist immer noch öffentlich...

Ich habe dort einen Workaround gefunden:

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Neue Version von MetaTrader 4 build 1170

fxsaber, 2019.09.06 09:39 Uhr.

Ich glaube, dass die vorgeschlagene Option in MT5 eine Neuerung ist, die auch in MT4 hinzugefügt werden sollte.

Aber wenn man den Code auf die altmodische Weise schreibt, wird er überall funktionieren.

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

So funktioniert mein Beispiel:

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


Aber das ist natürlich keine Lösung.

 

@Ilyas, keine Option ohne Umstellung auf CA?