Discussion de l'article "Les bases de la programmation MQL5 : Listes" - page 6

 
papaklass:

Messieurs, pourquoi ne pas essayer d'avoir une discussion de fond ? :)

Une feuille correcte ne devrait pas nécessiter l'implémentation explicite d'une nouvelle classe pour l'utiliser dans une classe arbitraire.

Par conséquent, l'implémentation correcte devrait s'appuyer sur les modèles.

Pour être juste, je ne suis pas sûr que cela soit réalisable au niveau des modèles présentés.

Mais cela est très éloigné des problèmes évoqués dans l'article.

 
TheXpert:


Une liste correcte ne devrait pas nécessiter l'implémentation explicite d'une nouvelle classe pour l'utiliser avec une classe arbitraire...

Ai-je bien compris que même si les nœuds (éléments de la liste) ont un type et un mode de connexion différents, la liste doit toujours avoir la même implémentation, c'est-à-dire se référer au même type de données? Conditionnellement, CList devrait inclure différents types de noeuds (CSingleNode, CDoubleNode, etc.)...
 
denkir:
Conditionnellement, CList doit inclure différents types de nœuds....

Pourquoi ? ) Un conteneur est un ensemble d'objets homogènes.

La différence entre les objets eux-mêmes peut être réalisée par le polymorphisme au sein d'objets existants et n'a rien à voir avec la liste.

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

Pourquoi ? ) Un conteneur est un ensemble d'objets homogènes.

La différence entre les objets eux-mêmes peut être réalisée par le polymorphisme au sein d'objets existants et n'a rien à voir avec la liste.

Il est clair qu'une liste concrète comprend des nœuds homogènes. Ce que je voulais dire, c'est que les relations entre les nœuds de cette liste peuvent être différentes, ce qui nécessite un type de liste différent pour chaque type de nœud. Si vous pouviez créer la même classe de liste pour des nœuds de types différents, ce serait formidable.... Personnellement, je n'ai pas encore essayé..... Il faut penser à un niveau d'abstraction plus élevé.....
 
TheXpert:

Une feuille correcte ne devrait pas nécessiter l'implémentation explicite d'une nouvelle classe afin de l'utiliser pour une classe arbitraire.

Par conséquent, une mise en œuvre correcte devrait s'appuyer sur des modèles.

Pour être honnête, je ne suis pas sûr que cela soit réalisable au niveau des modèles présentés.

Mais cela n'a rien à voir avec les problèmes évoqués dans l'article.

Comme je déteste l'admettre, l'expert a raison ici. Idéalement, la classe leaf devrait être implémentée sur des templates. Bien que la CList standard soit implémentée sur CObject.
 

Ce que propose TheXpert semble clair.

Si je comprends bien son idée, toutes les méthodes d'une liste abstraite devraient automatiquement reconnaître "son" nœud (c'est du polymorphisme).

Dans l'article, par exemple, il y a les classes utilisateur CiSingleList (Fig.9), CDoubleList (Fig.11), CiUnrollDoubleList (Fig.12), CiCircleDoubleList (Fig.13).

En principe, elles peuvent donc toutes être regroupées dans une seule classe. Mais nous devrons coder chaque méthode de manière à ce qu'elle reconnaisse le type de nœud dont elle s'occupe à un moment donné. Et cela nécessitera également une ressource... tout n'est donc pas si clair....

Когда нужно использовать указатели в MQL5
Когда нужно использовать указатели в MQL5
  • 2010.03.25
  • MetaQuotes Software Corp.
  • www.mql5.com
Все объекты в MQL5 по умолчанию передаются по ссылке, но есть возможность использовать и указатели объектов. При этом есть опасность получить в качестве параметра функции указатель неинициализированного объекта. В этом случае работа программы будет завершена критически с последующей выгрузкой. Автоматически создаваемые объекты как правило такой ошибки не вызывают, и в этом отношении они достаточно безопасны. В этой статье мы попробуем разобраться в чем разница между ссылкой и указателей, когда оправдано использование указателей и как написать безопасный код с использованием указателей.
 
Il est bon de voir la justice prévaloir au moins une fois de temps en temps. ))
 
denkir:
Il est clair qu'une liste particulière comprend des nœuds homogènes. Ce que je voulais dire, c'est que les relations entre les nœuds de cette liste peuvent être différentes, ce qui nécessite un type de liste différent pour chaque type de nœud. Si vous pouviez créer la même classe de liste pour des nœuds de types différents, ce serait formidable.... Personnellement, je n'ai pas encore essayé..... Il faut penser au niveau d'abstraction supérieur.....
Vous n'avez besoin que d'un seul type de nœud. Voir l'implémentation du CObject standard et l'implémentation des collections CArray, CList, CTree : MQL5 Reference --> Standard Library --> Classes for Data Organisation.
Документация по MQL5: Стандартная библиотека
Документация по MQL5: Стандартная библиотека
  • www.mql5.com
Стандартная библиотека - Документация по MQL5
 
...c'est beaucoup de travail. En pratique, qui va me montrer ?
 
denkir:

Ce que propose TheXpert semble clair.

Si je comprends bien son idée, toutes les méthodes d'une liste abstraite devraient automatiquement reconnaître "son" nœud (c'est du polymorphisme).

Dans l'article, par exemple, il y a les classes utilisateur CiSingleList (Fig.9), CDoubleList (Fig.11), CiUnrollDoubleList (Fig.12), CiCircleDoubleList (Fig.13).

En principe, elles peuvent donc toutes être regroupées dans une seule classe. Mais nous devrons coder chaque méthode de manière à ce qu'elle reconnaisse le type de nœud dont elle s'occupe à un moment donné. Et cela nécessitera également une ressource... tout n'est donc pas si clair...

Qu'est-ce qu'il y a à coder ?

#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);
   }
}
Première année, deuxième trimestre. Malheureusement, on ne peut pas se passer d'un intermédiaire communautaire, car MQL5 a un contrôle des types extrêmement faible. Mais si nous avions à notre disposition une fonction ClassToString comme EnumToString(), tout pourrait être organisé beaucoup plus élégamment et facilement.