Fragen zu OOP in MQL5 - Seite 82

 
Igor Makanu:

es spielt keine Rolle, was zu initialisieren, auch int - jede Zahl, um diesen Konstruktor aufzurufen

und ich habe 0,0 gewählt, um Druckfehler zu vermeiden - eine beliebige Ziffer, d. h. 0,0. Sie ist schwieriger zu schreiben und falsch zu drucken als 123

(doppelt)0

aber auch nicht so)))) hat sich den Code gerade normal angeschaut, es gibt noch eine Möglichkeit, ihn abnormal zu betrachten))
 
Alexandr Andreev:

(doppelt)0

keine

Ich schreibe nur 0,0 - keine anderen Zahlen werden erwartet - es gibt nicht einmal eine Variable im Konstruktor

im Allgemeinen, als modischer Stil eines Autors, vielleicht nicht der beste

 
Alexandr Andreev:

der Punkt ist nicht das x), sondern dass es einen Float auf dem Empfänger geben kann, und es ist auch nicht zuverlässig, 0,0 anzugeben

0.0 ist für den Compiler ein eindeutiges Double, float ist 0.f
 
Vladimir Simakov:
0.0 ist für den Compiler eindeutig double, float ist 0.f

Kredit)

 

Da die Rubrik "Fragen über 50" offen ist, möchte ich meine eigene zum Thema Gipsabdrücke einbringen.

- Welche Möglichkeiten gibt es, den Code im Hinblick auf Fehlertoleranz oder Nicht-Redundanz zu verbessern?

- Ist die PrüfungCheckPointer()!=POINTER_INVALID notwendig? Oder definitiv nicht notwendig? Erklären Sie warum.

- Bringing to non-const, so dass es möglich ist, Non-Const-Methoden aufzurufen. Können Nicht-Konst-Methoden direkt in der Compare-Methode aufgerufen werden, d.h. die gelb markierte const loswerden?

#include <ChartObjects\ChartObjectsShapes.mqh>

class CChartObjectRectangleX : public CChartObjectRectangle
  {
public:

   void CChartObjectRectangleX(){};      
   virtual int       Compare(const CObject *node,const int mode=0) const 
   {
   CChartObjectRectangleX *n=NULL;
   const CChartObjectRectangleX*nc=dynamic_cast<const CChartObjectRectangleX*>(node);
   if(nc!=NULL)
   n=(CChartObjectRectangleX *) nc;
   if(n!=NULL) {
     if(mode==0) return CompareDate(n); 
     if(mode==1) return CompareValue(n); }return 0;    }
 
   virtual int       CompareDate( CChartObjectRectangleX *node) const { 
   //if(node!=NULL) 
      return (this.Time(1)-node.Time(1)); return 0;    }
    virtual int       CompareValue( CChartObjectRectangleX *node) const { 
   //if(node!=NULL) 
      return ((this.Price(1)-node.Price(1))*10/Point()); return 0;    }
};
 
Aleksey Mavrin:

Da die Rubrik "Fragen über 50" offen ist, möchte ich meine eigenen zum Thema Gipsabdrücke einbringen.

- Welche Möglichkeiten gibt es, den Code im Hinblick auf Fehlertoleranz oder Nicht-Redundanz zu verbessern?

- Ist die Prüfung CheckPointer()!=POINTER_INVALID notwendig? Oder definitiv nicht notwendig? Erklären Sie warum.

- Bringing to non-const, so dass es möglich ist, Non-Const-Methoden aufzurufen. Können Nicht-Konst-Methoden direkt in der Compare-Methode aufgerufen werden, d.h. die gelb markierte const loswerden?

class CChartObjectRectangleX : public CChartObjectRectangle
  {
public:
   virtual int       Compare(const CObject *node,const int mode=0) const
   {
   const CChartObjectRectangleX *n=dynamic_cast<const CChartObjectRectangleX*>(node);
   return !n?0: mode==0?CompareDate(n):CompareValue(n);}
   
   virtual int CompareDate(const CChartObjectRectangleX *node) const {return !node?0:int(Time(1)-node.Time(1));}
   virtual int CompareValue(const CChartObjectRectangleX *node) const {return !node?0:(int)MathRound(((Price(1)-node.Price(1))*10/Point()));}
};

Scheint die gleiche zu sein wie Ihre, nur mit weniger Buchstaben. Es ist Geschmackssache, wem es besser gefällt, aber ich habe die zusätzliche Variable entfernt (der Compiler würde sie im Rahmen der Optimierung wahrscheinlich auch entfernen).

Bezüglich meines !node-Checks. Er muss durch CheckPointer(node)==POINTER_INVALID ersetzt werden, aber das ist ein Overhead - ein Funktionsaufruf. Selbst wenn es inlined ist, wird zumindest das Statusflag dereferenziert und überprüft. Wenn nur Bibliothek oder konkrete, Sie geschrieben haben Programm wird Compare-Methoden verwenden, besser !node und auf Code für ungültige Zeiger zu beobachten. Wenn Sie zu faul sind, auf Zeiger zu achten, oder wenn es sich um eine Bibliothek für Außenseiter handelt, genügt CheckPointer(node)==POINTER_INVALID.

Wenn Sie den hervorgehobenen const-Spezifizierer entfernen, können Sie diese Methoden nicht von einem konstanten Objekt aus aufrufen.

UPD: Die hervorgehobene Prüfung kann entfernt werden, da sie in den aufgerufenen Methoden enthalten ist.

 
Aleksey Mavrin:

Da die Rubrik "Fragen über 50" offen ist, möchte ich meine eigenen zum Thema Gipsabdrücke einbringen.

- Welche Möglichkeiten gibt es, den Code im Hinblick auf Fehlertoleranz oder Nicht-Redundanz zu verbessern?

- Ist die Prüfung CheckPointer()!=POINTER_INVALID notwendig? Oder definitiv nicht notwendig? Erklären Sie warum.

- Bringing to non-const, so dass es möglich ist, Non-Const-Methoden aufzurufen. Ist es möglich, eine Nicht-Konst-Methode direkt in der Compare-Methode aufzurufen, d.h. die gelb markierte const loszuwerden?

Die Idee ist, zwei Methoden der gleichen Funktion mit und ohne den const-Body zu schreiben - gelinde gesagt - das lohnt sich nicht))))

Aber die Wahrscheinlichkeit, auf zwei Methoden zu stoßen, liegt nahe bei Null.... Weil die Möglichkeit der Existenz vonCChartObjectRectangle::Price - ohne const im Körper - ich denke, es ist unwahrscheinlich.

Der Aufruf dieser Funktion von außen hat keine Auswirkungen. D.h. die const funktioniert nur mit internen Funktionen und stellt sicher, dass nichts in den Speicher des Objekts geschrieben wurde (der Wert der Variablen wurde nicht verändert). Mit anderen Worten, Sie können Set(a) nicht während der Konst... Oft, in einigen Verwirrung, um sicherzustellen, dass diese Funktion nicht überschreiben nichts, können Sie schnell diese Konstanten (obwohl dies wahrscheinlich meine Löschung).

Bedenken Sie, dass die Konstanten einfach überall hingeschoben werden sollten, ohne dass Sie )))) bekommen, damit es einfacher ist, später etwas zu überprüfen.


Braucht CheckPointer()!=POINTER_INVALID eine Prüfung?

Und warum nicht.... make one bool Check(<template> &T) { retun CheckPointer(T)!=POINTER_INVALID } Der Compiler sollte es so einfach wie möglich machen. Und es wird noch besser aussehen.

Es ist schneller.

int a[1000];
for (int i=0; i<ArraySize(a); i++)....
или
for (int i=ArraySize(a); i>=0; i--)....
дак вот разницы не должно быть вообще


Nun, ich habe nicht viel verändert.

template<typename T>
bool Check(T *a) {return CheckPointer(a)!=POINTER_INVALID;};

class CChartObjectRectangleX : public CChartObjectRectangle
  {
  #define  ME CChartObjectRectangleX
public:
   void ME(){};      
   virtual int       Compare(const CObject *node,const int mode=0) const 
   {
   const ME*nc=dynamic_cast<const ME*>(node);
   return Check(nc)?mode==0?CompareDate(nc):CompareValue(nc):0;
   } 
   virtual int       CompareDate(const ME *node) const            {return (this.Time(1)-node.Time(1));}
   virtual int       CompareValue(const ME *node) const           {return ((this.Price(1)-node.Price(1))*10/Point()); }
 #undef  ME
};

Dies ist Ihr gesamter Code.

 
Vladimir Simakov:

Es scheint dasselbe zu sein wie bei Ihnen, nur mit weniger Buchstaben. Es ist also Geschmackssache, aber ich habe die zusätzliche Variable entfernt (höchstwahrscheinlich hätte der Compiler sie im Rahmen der Optimierung entfernt).

Bezüglich meines !node-Checks. Er muss durch CheckPointer(node)==POINTER_INVALID ersetzt werden, aber das ist ein Overhead - ein Funktionsaufruf. Selbst wenn es inlined ist, wird zumindest das Statusflag dereferenziert und überprüft. Wenn nur Bibliothek oder konkrete, Sie geschrieben haben Programm wird Compare-Methoden verwenden, besser !node und auf Code für ungültige Zeiger zu beobachten. Wenn Sie zu faul sind, auf Zeiger zu achten, oder wenn es sich um eine Bibliothek für Außenseiter handelt, genügt CheckPointer(node)==POINTER_INVALID.

Wenn Sie den const-Spezifizierer entfernen, können Sie diese Methoden nicht von einem konstanten Objekt aus aufrufen.

es hat lange gedauert, bis ich die Registerkarte geöffnet habe


Ich schätze, dass 4 Jahre College nicht viel zu meinem Wissen beigetragen haben (die Erklärung hinkt im Papierkorb hinterher).

 

die Variante ohne die Konstitution, da die Basisklasse keinen Bezug zu Eingabeparametern hat, wird ebenfalls korrekt funktionieren, auch wenn dies kein sehr intelligenter Stil ist

#include <ChartObjects\ChartObjectsShapes.mqh>

template<typename T>
bool Check(T *a) {return CheckPointer(a)!=POINTER_INVALID;};

class CChartObjectRectangleX : public CChartObjectRectangle
  { #define  ME CChartObjectRectangleX
public: 
   void ME(){};      
   virtual int       Compare(CObject *node,int mode=0) 
   {
   ME*nc=dynamic_cast<ME*>(node);
   return Check(nc)?mode==0?CompareDate(nc):CompareValue(nc):0;
   } 
   virtual int       CompareDate(ME *node)             {return (this.Time(1)-node.Time(1));}
   virtual int       CompareValue(ME *node)            {return ((this.Price(1)-node.Price(1))*10/Point()); }
 #undef  ME
};
 

Auch eine Variante desselben Codes.

template<typename T>
bool Check(T *a) {return CheckPointer(a)!=POINTER_INVALID;};

class CChartObjectRectangleX : public CChartObjectRectangle
  { #define  ME CChartObjectRectangleX
public: 
   void ME(){};      
   virtual int       Compare(CObject *node,int mode=0)      {return Check(node)?mode==0?CompareDate(node):CompareValue(node):0;} 
   virtual int       CompareDate(CObject *node)             {return (  Time(1)-dynamic_cast<ME*>(node).Time(1));}
   virtual int       CompareValue(CObject *node)            {return ((Price(1)-dynamic_cast<ME*>(node).Price(1))*10/Point()); }
 #undef  ME
};


Es ist die gleiche mit den Konstanten.

template<typename T>
bool Check(T *a) {return CheckPointer(a)!=POINTER_INVALID;};

class CChartObjectRectangleX : public CChartObjectRectangle
  { #define  ME CChartObjectRectangleX
public: 
   void ME(){};      
   virtual int       Compare(CObject const *node,int const mode=0)   const{return Check(node)?mode==0?CompareDate(node):CompareValue(node):0;} 
   virtual int       CompareDate(CObject const *node)                const{return (  Time(1)-dynamic_cast<const ME*>(node).Time(1));}
   virtual int       CompareValue(CObject const *node)               const{return ((Price(1)-dynamic_cast<const ME*>(node).Price(1))*10/Point()); }
 #undef  ME
};
Grund der Beschwerde: