Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 1334

 
Artyom Trishkin:
Es war Alexey, der etwas in dem von mir angegebenen Code geändert hat. Oder vielleicht habe ich es unterschätzt - ich habe es "auf den Knien" geschrieben, als einfaches Beispiel, um zu verdeutlichen, woran ich mich nicht mehr erinnere.

Vielleicht kann Alexej es uns sagen.)

 
Valeriy Yastremskiy:

Die Iteration des Zyklus endet nicht, und es beginnt auch keine neue, sondern es wird zum nächsten Wenn übergegangen. Die Logik wird sich ändern.

Nein. Die Bedingung ist ursprünglich so festgelegt, dass der Zeiger, wenn er erfolgreich erstellt wurde, zur Liste hinzugefügt wird. Die Kurvenklammer ist geschlossen, und wenn ein Fehler auftritt, wird die Addition nicht ausgeführt. Die Logik ist beim continue-Operator etwas anders, aber das Ergebnis ist das gleiche.
 

Artyom Trishkin:
Это Алексей что-то переделывал в том коде, который я давал. А может и я недоглядел - писал "на коленке" в качестве простого примера для пояснения уже не помню чего.

//+------------------------------------------------------------------+
//| CNewBar Time Возвращает время нулевого бара                      |
//+------------------------------------------------------------------+
datetime CNewBar::Time(void)
  {
   datetime array[1], ret;
   ret = CopyTime(this.m_symbol, this.m_timeframe, 0, 1, array) == 1 ? array[0] : 0;
   return(array[0]);
 }
//+------------------------------------------------------------------+
//| CNewBar IsNewBar Основная функция класса                         |
//+------------------------------------------------------------------+
bool CNewBar::IsNewBar(void)
  {
   datetime tm = this.Time();
   if(tm == 0)
      return false;
   if(tm != this.m_time)
     {
      this.m_time = tm;
      return true;
     }
   return false;
  }


Artem, warum wird das this-Schlüsselwort hier verwendet? Ohne es funktionieren Methoden mit Klassenmitgliedern...

 
Mikhail Tkachev:

Alexey, vielen Dank für diese ausführliche Antwort.
Der Zweck der ret-Variable in dem angegebenen Codefragment ist nicht klar...
Warum wird es berechnet, wenn die Methode trotzdem array[0] zurückgibt?
P.S.
Und warum wird dies in einer Klassenmethode verwendet? Wir arbeiten mit Mitgliedern dieser besonderen Klasse...


  1. Da die Funktion CopyTime einen Wert zurückgibt, lassen Sie sie in eine Variable zurückkehren, das macht die Sache nicht schlimmer... Im Falle einer Fehlersuche können Sie überprüfen, was Sie bekommen haben.
  2. dies wurde von Artyom geschrieben. Offenbar sind es persönliche Vorlieben. Manche Leute schreiben, müssen - dürfen nicht schreiben ::
ps; Mir ist gerade aufgefallen, dass die ret datetime-Variable vom Typ... Natürlich sollte sie vom Typ int sein. Tja, das muss ich auch noch in Ordnung bringen...
 
Alexey Viktorov:
  1. Da die CopyTime-Funktion einen Wert zurückgibt, lassen Sie sie in eine Variable zurückkehren, es wird es nicht schlimmer machen... Im Falle der Fehlersuche können Sie überprüfen, was Sie haben.
  2. dies wurde von Artyom geschrieben. Offenbar sind es persönliche Vorlieben. Einige Leute, ist es notwendig - nicht notwendig schreiben ::

1. Wozu dient hier die Funktion CopyTime?

2. Vielleicht wird Artem darauf antworten - ist es eine persönliche Vorliebe oder ist es notwendig?

 
Mikhail Tkachev:

1. Wozu dient die Funktion CopyTime?

2. Vielleicht wird Artem darauf antworten - ist es eine persönliche Vorliebe oder ist es notwendig?

Wenn Sie CopyTime() nicht mögen, ersetzen Sie es durch iTime(). Es gibt keinen Unterschied, die Hauptsache ist, dass man die Zeit des aktuellen Taktes erhält.

In meinem Kopf erinnere ich mich vage daran, wann er geschrieben wurde. Ich glaube, ich habe diese Frage auch gestellt... Und wenn ich mich nicht irre, wird dadurch sichergestellt, dass der Verweis nur auf lokale Methoden erfolgt, falls es ähnliche Methoden in anderen Klassen gibt. Und natürlich wird Artyom das klären.

 
Alexey Viktorov:
Nein. Die Bedingung ist ursprünglich so festgelegt, dass der Zeiger, wenn er erfolgreich erstellt wurde, zur Liste hinzugefügt wird. Die Kurvenklammer ist geschlossen, und wenn ein Fehler auftritt, wird die Addition nicht ausgeführt. Die Logik ist beim continue-Operator etwas anders, aber das Ergebnis ist das gleiche.

Ja, das Ergebnis ist dasselbe, das Innere ist anders. Ich denke, dass es mit der Fortsetzung schneller geht, auch wenn es sich um Farbe und Logik handelt ....

 
Mikhail Tkachev:


Artem, warum wird das Schlüsselwort this hier verwendet? Weil Methoden auch ohne dieses Schlüsselwort mit Klassenmitgliedern funktionieren...

Sie werden. Ich benutze es, weil ich es will :) Sie gibt ausdrücklich an, welche Klassenmethoden verwendet werden.

Wenn Sie zwei Klassen haben, eine als Elternteil und eine als Nachkomme, und Sie haben zwei Methoden mit demselben Namen, die aber aus irgendeinem Grund nicht virtuell sind, müssen Sie explizit angeben, welche davon verwendet werden soll.

Angenommen, die übergeordnete Klasse ist CParent und die geerbte Klasse ist CInheritedund beide haben die Methode Method().

Wenn wir in diesem Fall eine Methode Method() einer CParent-Klasse aufrufen, ruft diese explizit eine Methode der CParent-Klasse auf - dies ist hier nicht erforderlich. Wir können die Methode mit oder ohne sie aufrufen.

Wenn wir eineMethode() in einer geerbten CInherited-Klasseaufrufen ,wird auch die Methodedieser Klasse aufgerufen, da wir zuerst nach einer Methode suchen, die zu der Klasse gehört, aus der wir sie aufrufen.

Wenn wir CParent::Method() in einer CInherited-Klasseaufrufen , wird auf diese Weise die Methode der Elternklasse aufgerufen, da wir durch den Kontextauflösungsoperator explizit eine Methode angegeben haben, die zur Elternklasse gehört.

Aber trotzdem würde ich die Methode Method() in einer geerbten CInherited-Klasse mit this - um sicher zu sein, dass diese (this == "this") geerbte Klasse aufgerufen wird.

Es gibt auch andere Erklärungen für diese Verwendung. Vielleicht kann uns das jemand sagen, der mehr Erfahrung mit OOP hat.

 
Valeriy Yastremskiy:

Ja, das Ergebnis ist dasselbe, das Innere ist anders. Ich denke, dass es mit der Fortsetzung schneller geht, auch wenn es sich um Farbe und Logik handelt ....

Da sollte es keinen Unterschied geben. Ich finde es einfach schöner - weniger Klammern und Einrückungen.

 
Alexey Viktorov:
  1. Da die CopyTime-Funktion einen Wert zurückgibt, lassen Sie sie in eine Variable zurückkehren, es wird es nicht schlimmer machen... Im Falle der Fehlersuche können Sie überprüfen, was Sie haben.
  2. dies wurde von Artyom geschrieben. Offenbar sind es persönliche Vorlieben. Einige von ihnen schreiben es, ich brauche es nicht ::
ps; Mir ist gerade aufgefallen, dass die ret datetime-Variable vom Typ... Natürlich sollte sie vom Typ int sein. Aber egal, das muss ich auch noch reparieren...

Nun ja, ich gehöre zu diesen "einigen", vor allem wenn ich eine Standardfunktion aus einer Klasse aufrufe, gebe ich immer den globalen Kontext an. Nur weil ich mir vorstellen kann, in dieser Klasse eine Methode mit demselben Namen wie die Standardfunktion zu schreiben - damit ich nie vergesse, was sie tut. Und da ist :: nützlich, um die Standardfunktion aufzurufen, und dies ist nützlich, um meine Methode mit demselben Namen aufzurufen.

Grund der Beschwerde: