PLO. Fragen zur Anwendung - Seite 3

 

Technische Referenz. Ein Beispiel für einen "Wrapping-Mechanismus" bei der Arbeit mit Klassen (damit Sie nicht danach suchen müssen):

https://www.mql5.com/ru/forum/3555/page3#comment_57315

Ограничение кеша индикатора.
Ограничение кеша индикатора.
  • www.mql5.com
Но вот нет никакой возможности ограничить автоматическую загрузку данных в кеш индикатора.
 

Frage. Der neue Betreiber. Im Referenzhandbuch heißt es, dass new ein Operator ist; in den Beispielen wird jedoch häufig nach der Verwendung dieses Operators geprüft, ob er gleich NULL ist. Zum Beispiel:

//+------------------------------------------------------------------+
//| Создание фигуры                                                  |
//+------------------------------------------------------------------+
void CTetrisField::NewShape()
  {
   m_ypos=HORZ_BORDER;
//--- случайным образом создаём одну из 7 возможных фигур
   int nshape=rand()%7;
   switch(nshape)
     {
      case 0: m_shape=new CTetrisShape1; break;
      case 1: m_shape=new CTetrisShape2; break;
      case 2: m_shape=new CTetrisShape3; break;
      case 3: m_shape=new CTetrisShape4; break;
      case 4: m_shape=new CTetrisShape5; break;
      case 5: m_shape=new CTetrisShape6; break;
      case 6: m_shape=new CTetrisShape7; break;
     }
//--- отрисовываем
   if(m_shape!=NULL)
     {
      //--- начальные установки
      m_shape.SetRightBorder(WIDTH_IN_PIXELS+VERT_BORDER);
      m_shape.SetYPos(m_ypos);
      m_shape.SetXPos(VERT_BORDER+SHAPE_SIZE*8);
      //--- отрисуем
      m_shape.Draw();
     }
//---
  }

Es wird auch gesagt, dass"NULL mit Zeigern auf Objekte verglichen werden kann, die mit dem new-Operator erstellt wurden".

Es stellt sich also heraus, dass der neue Operator nicht immer ein neues Objekt erzeugt? Oder ist die Überprüfung der Gleichheit eines erstellten Objekts mit NULL eine Besonderheit des Stils eines Entwicklers und nicht obligatorisch?

 
Yedelkin:

Frage. Der neue Betreiber. Im Referenzhandbuch heißt es, dass new ein Operator ist; in den Beispielen wird jedoch häufig nach der Verwendung dieses Operators geprüft, ob er gleich NULL ist. Zum Beispiel:

Es wird auch gesagt, dass"NULL mit Zeigern auf Objekte verglichen werden kann, die mit dem new-Operator erstellt wurden".

Es stellt sich also heraus, dass der neue Operator nicht immer ein neues Objekt erzeugt? Oder ist die Überprüfung der Gleichheit eines erstellten Objekts mit NULL eine Besonderheit des Stils eines Entwicklers und nicht obligatorisch?

Wenn Sie ein dynamisches Objekt an einer Stelle des Programms erstellen, ist es logisch, dass Sie es an einer anderen Stelle zerstören, und es ist keine Tatsache, dass dies alles innerhalb einer Funktion geschieht, daher eine einfache Faustregel, bevor Sie einen Zeiger verwenden, um zu prüfen, ob er existiert.
 
Urain:
Wenn Sie ein dynamisches Objekt an einer Stelle in einem Programm erstellen, ist es logisch, dass Sie es an einer anderen Stelle wieder zerstören, und es ist nicht sicher, dass dies alles innerhalb einer Funktion geschieht, so dass eine einfache Regel darin besteht, vor der Verwendung eines Zeigers zu prüfen, ob es existiert.

Das ist richtig. In den Beispielen im Referenzhandbuch erfolgt die Prüfung jedoch unmittelbar nach der Erstellung des Objekts, d.h. an einer Stelle im Programm und innerhalb einer Funktion. Und die hier angegebene Regel ist nicht ganz zutreffend. Warum sollte die Prüfung direkt nach der Erstellung eines Objekts durchgeführt werden?Es stellt sich also heraus, dass der neue Operator nicht immer ein neues Objekt erzeugt? =(Ich wiederhole)=

Hier ist ein weiteres Beispiel unter vielen:

//--- example for CArrayString::Add(string)
#include <Arrays\ArrayString.mqh>
//---
void OnStart()
  {
   CArrayString *array=new CArrayString;
   //---
   if(array==NULL)
     {
      printf("Object create error");
      return;
     } 
 
Yedelkin:

Das ist richtig. In den Beispielen im Referenzhandbuch wird die Prüfung jedoch unmittelbar nach der Erstellung des Objekts durchgeführt, d.h. an einer Stelle im Programm und innerhalb einer Funktion. Und die oben genannte Regel ist hier nicht anwendbar. Warum sollte die Prüfung gleich nach der Erstellung des Objekts durchgeführt werden?Es stellt sich also heraus, dass der neue Operator nicht immer ein neues Objekt erzeugt (ich wiederhole das)?

Hier ist ein weiteres Beispiel unter vielen:

Es gibt diese Möglichkeit. In der Hilfe, der erste Absatz.
 
Lizar:
Es gibt eine solche Möglichkeit. In der Referenz, der erste Absatz.
GUT. Es stellt sich heraus, dass das Verhalten des Betreibers wie eine Funktion ist. Sie kann es schaffen, muss es aber nicht.
 
Yedelkin:
GUT. Es stellt sich heraus, dass das Verhalten des Operators das einer Funktion ist. Sie kann erstellt werden, muss aber nicht.
Zum Beispiel ist nicht genügend Speicher für das Objekt vorhanden.
 
Rosh:
Zum Beispiel war nicht genügend Speicherplatz für ein Objekt vorhanden.
Manchmal hilft eine einfache Erklärung, den eigenen Horizont erheblich zu erweitern. Ich danke Ihnen!
 

Frage. Wenn eine virtuelle Funktion mit einem bestimmten Satz von Parametern und Typen in einer übergeordneten Klasse deklariert ist, können dann die Anzahl und die Typen der Parameter der entsprechenden virtuellen Funktionen in den abgeleiteten Klassen geändert werden?

Einerseits heißt es im Referenzhandbuch, dass "eine virtuelle Funktion in einer abgeleiteten Klasse ersetzt werden kann. Die Entscheidung, welche Funktionsdefinition für die virtuelle Funktion aufgerufen werden soll, wird dynamisch (zur Laufzeit) getroffen. Ein typischer Fall ist, wenn eine Basisklasse eine Funktion enthält und abgeleitete Klassen ihre eigenen Versionen dieser Funktion haben". Andererseits beziehen sich die im Referenzhandbuch angeführten Beispiele auf Fälle, in denen virtuelle Funktionen unterschiedliche Funktionsdefinitionskörper und nicht Funktionsdefinitionsköpfe haben.

 
Yedelkin:

Frage. Ist es nach der Deklaration einer virtuellen Funktion mit einem bestimmten Satz von Parametern und deren Typen in einer übergeordneten Klasse möglich, die Anzahl und die Typen der Parameter der entsprechenden virtuellen Funktionen in den untergeordneten Klassen zu ändern?

Nur eine exakte Kopie der Definition, mit Ausnahme der Standardparameter (die Standardwerte können variieren, aber es ist besser, diese nicht zu verwenden)