PLO. Fragen zur Anwendung - Seite 2

 
Urain:

Der new-Operator erzeugt eine Instanz der Klasse und ein Konstruktor wird in Verbindung mit ihm aufgerufen. Sie ist in der Syntax festgeschrieben, so dass es keine andere Möglichkeit gibt, sie aufzurufen.

Ich bin von diesem Beispiel ausgegangen:

//+------------------------------------------------------------------+
//| Создание фигуры                                                  |
//+------------------------------------------------------------------+
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;
     }
Grob gesagt, gibt es hier keine Klammern (Konstruktoraufruf). Es ist möglich, dass ich noch etwas übersehen habe.
 
Urain:

Dieser Code unterscheidet sich fast nicht von der Mehrfachvererbung.

In der Tat hat die Klasse C_C über entsprechende Zeiger Zugriff auf die Daten von C_A und C_B.


Dies wird als Aggregation bezeichnet
 
Yedelkin:

Ich habe mich an diesem Beispiel orientiert:

Hier gibt es, grob gesagt, keine Klammern (Aufruf des Konstruktors). Es ist möglich, dass ich etwas noch nicht verstanden habe.

Warum ich, es ist nicht für mich, es ist für die Zentralwäscherei, ich habe keine Klammern genommen :o)
 
Urain:
Warum ich, es ist nicht für mich, es ist für die Zentralwäscherei, ich habe keine Klammern benutzt :o)

Mein Compiler beschwert sich nicht über fehlende Klammern...

      case  50: d_Control=new CControl_50; break;

Wie auch immer, es stellte sich plötzlich die Frage, wie man es richtig macht. Oder macht es keinen Unterschied, ob es Klammern gibt oder nicht?

 
Yedelkin:

Mein Compiler beschwert sich nicht über fehlende Klammern...

Wie dem auch sei, plötzlich stellte sich die Frage: Was ist der richtige Weg? Oder macht es keinen Unterschied, ob es Klammern gibt oder nicht?

Wenn es in beide Richtungen funktioniert, ist es eher eine Frage der Vereinheitlichung der Syntax. Die Hauptsache ist, dass die Geschwindigkeit nicht beeinträchtigt wird.

ZS Und funktioniert das überhaupt? Ehrlich gesagt habe ich das nicht überprüft, ich schreibe immer mit Klammern.

 
Urain:

Wenn es in beide Richtungen funktioniert, ist es eher eine Frage der Vereinheitlichung der Syntax. Die Hauptsache ist, dass die Geschwindigkeit nicht beeinträchtigt wird.

ZS Funktioniert das überhaupt? Um ehrlich zu sein, habe ich es nicht überprüft, ich schreibe immer mit Klammern.

Bisher kann ich nur über die Kompilierungsergebnisse sprechen. Es ist noch ein weiter Weg, um zu prüfen, ob der Code tatsächlich funktioniert.
 

Ich habe die Beschreibung der dynamischen Erstellung von Klassenobjekten in MQL5 nicht gelesen, aber in C++ kann man dies ohne Klammern (der Standardkonstruktor wird aufgerufen) und mit Klammern (der Konstruktor wird abhängig von den Parametern in den Klammern aufgerufen) tun. Beispiel:


class CExample
{
    int param;
public:
    CExample();
    CExample(int x);
    ~CExample();
}

CExample::CExample(int x)
{
    param = x;
}

//..........вызов..............
//..где-то в тексте программы..

   CExample *ex1 = new CExample;         //создание с конструктором CExample();
   CExample *ex1 = new CExample();       //создание с конструктором CExample();
   CExample *ex1 = new CExample(value);  //создание с конструктором CExample(int x);

Документация по MQL5: Основы языка / Типы данных / Структуры и классы
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
  • www.mql5.com
Основы языка / Типы данных / Структуры и классы - Документация по MQL5
 
In mql5 können Sie keine Parameter an den Konstruktor übergeben.
 
Vigor:
In mql5 können noch keine Parameter an den Konstruktor übergeben werden.

klären " In mql5 können dem Konstruktor noch keine Parameter übergeben werden".
 
PiramidaR:

Ich habe die Beschreibung der dynamischen Erstellung von Klassenobjekten in MQL5 nicht gelesen, aber in C++ kann man dies ohne Klammern (der Standardkonstruktor wird aufgerufen) und mit Klammern (der Konstruktor wird abhängig von den Parametern in den Klammern aufgerufen) tun. Beispiel:

Verstanden, danke für die einfache und direkte Erklärung. Es stellt sich heraus, dass die Klammern für mögliche Parameter stehen.

Und die Beschreibung, wie man dynamische Klassenobjekte in MQL5 erstellt, ist sehr knapp gehalten:

MQL5 Referenz / Grundlagen der Sprache / Operatoren / Objekterstellungsoperator new

MQL5 Referenz / Sprachgrundlagen / Datentypen / Objektzeiger