Diskussion zum Artikel "Grundlagen der Programmierung in MQL5: Listen" - Seite 6

 
papaklass:

Meine Herren, warum versuchen wir nicht, eine sachliche Diskussion zu führen? :)

Ein korrektes Blatt sollte keine explizite Implementierung einer neuen Klasse erfordern, um sie für eine beliebige Klasse zu verwenden.

Daher sollte sich die korrekte Implementierung auf Vorlagen stützen.

Um fair zu sein, bin ich mir nicht sicher, ob dies auf der vorgestellten Template-Ebene realisierbar ist.

Aber das ist eigentlich weit entfernt von den Problemen in dem Artikel.

 
TheXpert:


Eine korrekte Liste sollte keine explizite Implementierung einer neuen Klasse erfordern, um sie für eine beliebige Klasse zu verwenden...

Verstehe ich das richtig, dass, auch wenn die Knoten (Listenelemente) unterschiedliche Typen und Verbindungsarten haben, die Liste trotzdem die gleiche Implementierung haben sollte, d.h. auf den gleichen Datentyp verweisen sollte? Bedingt sollte CList verschiedene Arten von Knoten enthalten (CSingleNode, CDoubleNode, etc.)...
 
denkir:
Bedingt, CList sollte verschiedene Arten von Knoten enthalten....

Warum eigentlich? ) Ein Container ist eine Menge von homogenen Objekten.

Die Unterschiedlichkeit der Objekte selbst kann durch Polymorphismus innerhalb der Objekte realisiert werden und hat nichts mit der Liste zu tun.

Когда нужно использовать указатели в MQL5
Когда нужно использовать указатели в MQL5
  • 2010.03.25
  • MetaQuotes Software Corp.
  • www.mql5.com
Все объекты в MQL5 по умолчанию передаются по ссылке, но есть возможность использовать и указатели объектов. При этом есть опасность получить в качестве параметра функции указатель неинициализированного объекта. В этом случае работа программы будет завершена критически с последующей выгрузкой. Автоматически создаваемые объекты как правило такой ошибки не вызывают, и в этом отношении они достаточно безопасны. В этой статье мы попробуем разобраться в чем разница между ссылкой и указателей, когда оправдано использование указателей и как написать безопасный код с использованием указателей.
 
TheXpert:

Warum? ) Ein Container ist eine Menge von homogenen Objekten.

Die Unterschiedlichkeit der Objekte selbst kann durch Polymorphismus innerhalb der Objekte realisiert werden und hat nichts mit der Liste zu tun.

Es ist klar, dass eine konkrete Liste homogene Knoten enthält. Was ich meinte, war, dass die Beziehungen zwischen den Knoten in dieser Liste unterschiedlich sein können, was für jede Art von Knoten einen anderen Listentyp erfordert. Wenn Sie dieselbe Listenklasse für Knoten verschiedener Typen erstellen könnten, wäre das großartig.... Ich persönlich habe es noch nicht ausprobiert..... Man muss über eine höhere Abstraktionsebene nachdenken.....
 
TheXpert:

Ein korrektes Blatt sollte keine explizite Implementierung einer neuen Klasse erfordern, um sie für eine beliebige Klasse zu verwenden.

Daher sollte eine korrekte Implementierung auf Vorlagen beruhen.

Um fair zu sein, bin ich mir nicht sicher, ob dies auf der vorgestellten Template-Ebene realisierbar ist.

Aber das ist eigentlich weit entfernt von den Problemen in dem Artikel.

Wie ich nur ungern zugebe, hat der Experte hier recht. Idealerweise sollte die Blattklasse auf Templates implementiert werden. Obwohl die Standard CList auf CObject implementiert ist.
 

Was TheXpert vorschlägt, scheint klar zu sein.

Wenn ich seine Idee richtig verstehe, sollten alle Methoden einer abstrakten Liste automatisch "ihren" Knoten erkennen (das ist Polymorphismus).

In dem Artikel gibt es zum Beispiel die Benutzerklassen CiSingleList (Abb.9), CDoubleList (Abb.11), CiUnrollDoubleList (Abb.12), CiCircleDoubleList (Abb.13).

Im Prinzip kann man sie alle in eine Klasse packen. Aber wir müssen jede Methode so kodieren, dass sie den Typ des Knotens erkennt, mit dem sie gerade zu tun hat. Und dafür wird auch eine Ressource benötigt... also ist nicht alles so eindeutig....

Когда нужно использовать указатели в MQL5
Когда нужно использовать указатели в MQL5
  • 2010.03.25
  • MetaQuotes Software Corp.
  • www.mql5.com
Все объекты в MQL5 по умолчанию передаются по ссылке, но есть возможность использовать и указатели объектов. При этом есть опасность получить в качестве параметра функции указатель неинициализированного объекта. В этом случае работа программы будет завершена критически с последующей выгрузкой. Автоматически создаваемые объекты как правило такой ошибки не вызывают, и в этом отношении они достаточно безопасны. В этой статье мы попробуем разобраться в чем разница между ссылкой и указателей, когда оправдано использование указателей и как написать безопасный код с использованием указателей.
 
Es ist gut, dass die Gerechtigkeit wenigstens ab und zu siegt. ))
 
denkir:
Es ist klar, dass eine bestimmte Liste homogene Knoten enthält. Was ich meinte, war, dass die Beziehungen zwischen den Knoten in dieser Liste unterschiedlich sein können, was für jede Art von Knoten einen anderen Listentyp erfordert. Wenn Sie dieselbe Listenklasse für Knoten verschiedener Typen erstellen könnten, wäre das großartig.... Ich persönlich habe es noch nicht ausprobiert..... Man muss über eine höhere Abstraktionsebene nachdenken.....
Sie brauchen nur einen Knotentyp. Siehe die Implementierung des Standard-CObjects und die Implementierung von CArray-, CList-, CTree-Sammlungen: MQL5 Referenz --> Standardbibliothek --> Klassen für die Datenorganisation.
Документация по MQL5: Стандартная библиотека
Документация по MQL5: Стандартная библиотека
  • www.mql5.com
Стандартная библиотека - Документация по MQL5
 
...ist eine Menge Arbeit. Praktisch, wer zeigt es mir?
 
denkir:

Was TheXpert vorschlägt, scheint klar zu sein.

Wenn ich seine Idee richtig verstehe, sollten alle Methoden einer abstrakten Liste automatisch "ihren" Knoten erkennen (das ist Polymorphismus).

In dem Artikel gibt es zum Beispiel die Benutzerklassen CiSingleList (Abb.9), CDoubleList (Abb.11), CiUnrollDoubleList (Abb.12), CiCircleDoubleList (Abb.13).

Im Prinzip kann man sie alle in eine Klasse packen. Aber wir müssen jede Methode so kodieren, dass sie den Typ des Knotens erkennt, mit dem sie gerade zu tun hat. Und das wird auch eine Ressource erfordern... also ist nicht alles so eindeutig...

Was gibt es zu kodieren?

#include <Object.mqh>
#include <Arrays\ArrayObj.mqh>

enum ENUM_CLASS_TYPE
{
   HUMAN,
   ANIMAL,
   CAR
};

class Community : public CObject
{
   public:
      ENUM_CLASS_TYPE TypeCommunity(){return type;}
   protected:
      Community(ENUM_CLASS_TYPE cType)
      {
          type = cType;
      }
      
   private:
      ENUM_CLASS_TYPE type;
};

class Human : public Community
{
   public:
      Human() : Community(HUMAN){;}
      int IQ(){return 90;}
};

class Animal : public Community
{
   public:
      Animal() : Community(ANIMAL){;}
      int CountLegs(){return 4;}
};

class Car : public Community
{
   public:
      Car() : Community(CAR){;}
      int Speed(){return 20;}
};

void OnStart()
{
   CArrayObj elements;
   CObject* object = NULL;
   while(elements.Total() < 100)
   {
      switch(rand()%3)
      {
         
         case HUMAN:
            object = new Human();
            break;
         case ANIMAL:
            object = new Animal();
            break;
         case CAR:
            object = new Car();
            break;
      }
      elements.Add(object);
   }
   while(elements.Total() > 0)
   {
      Community* AnyObject = elements.At(0); 
      switch(AnyObject.TypeCommunity())
      {
         case HUMAN:
         {
            Human* human = AnyObject;
            printf("Element is Human, it's IQ is: " + (string)human.IQ());
            break;
         }
         case ANIMAL:
         {
            Animal* animal = AnyObject;
            printf("Element is anima, it has " + (string)animal.CountLegs() + " legs.");
            break;
         }
         case CAR:
         {
            Car* car = AnyObject;
            printf("Element is car. It has speed " + (string)car.Speed() + " km/h");
            break;
         }
      }
      elements.Delete(0);
   }
}
Erste Klasse, zweites Quartal. Leider geht es nicht ohne einen Community-Vermittler, denn MQL5 hat eine extrem schwache Typkontrolle. Hätten wir aber eine ClassToString-Funktion wie EnumToString() zur Verfügung, könnte man alles viel eleganter und einfacher organisieren.