Discussione sull’articolo "Forum sulla programmazione MQL5 Liste" - pagina 6

 
papaklass:

Signori, perché non proviamo a fare una discussione concreta? :)

Un foglio corretto non dovrebbe richiedere l'implementazione esplicita di una nuova classe per usarla per una classe arbitraria.

Pertanto, l'implementazione corretta dovrebbe fare affidamento sui template.

Ad essere onesti, non sono sicuro che questo sia realizzabile al livello di template presentato.

Ma questo è in realtà molto lontano dai problemi dell'articolo.

 
TheXpert:


Un elenco corretto non dovrebbe richiedere l'implementazione esplicita di una nuova classe per usarlo per una classe arbitraria...

Ho capito bene che anche se i nodi (elementi della lista) hanno un tipo diverso e un modo diverso di connessione tra loro, la lista dovrebbe comunque avere la stessa implementazione, cioè fare riferimento allo stesso tipo di dati? Condizionatamente CList dovrebbe includere diversi tipi di nodi (CSingleNode, CDoubleNode, ecc.)...
 
denkir:
Condizionalmente, CList dovrebbe includere diversi tipi di nodi....

Perché? ) Un contenitore è un insieme di oggetti omogenei.

La differenza degli oggetti stessi può essere realizzata tramite il polimorfismo all'interno di oggetti già esistenti e non ha nulla a che fare con l'elenco.

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

Perché? ) Un contenitore è un insieme di oggetti omogenei.

La differenza degli oggetti stessi può essere realizzata dal polimorfismo all'interno di oggetti già esistenti e non ha nulla a che fare con la lista.

È chiaro che una lista concreta comprende nodi omogenei. Intendevo dire che le relazioni tra i nodi di quella lista possono essere diverse, il che richiede un tipo di lista diverso per ogni tipo di nodo. Se si potesse creare la stessa classe di lista per nodi di tipo diverso, sarebbe fantastico.... Personalmente non l'ho ancora provato..... Bisogna pensare a un livello di astrazione più alto.....
 
TheXpert:

Un foglio corretto non dovrebbe richiedere l'implementazione esplicita di una nuova classe per poterla utilizzare per una classe arbitraria.

Pertanto, l'implementazione corretta dovrebbe affidarsi ai template.

Ad essere onesti, non sono sicuro che questo sia realizzabile al livello di template presentato.

Ma questo è in realtà molto lontano dai problemi dell'articolo.

Come odio ammettere, l'esperto ha ragione. Idealmente, la classe leaf dovrebbe essere implementata su template. Anche se la CList standard è implementata su CObject.
 

Quello che propone TheXpert sembra essere chiaro.

Se ho capito bene la sua idea, tutti i metodi di una lista astratta dovrebbero riconoscere automaticamente il "suo" nodo (questo è polimorfismo).

Nell'articolo, ad esempio, ci sono le classi utente CiSingleList (Fig.9), CDoubleList (Fig.11), CiUnrollDoubleList (Fig.12), CiCircleDoubleList (Fig.13).

Quindi, in linea di principio, tutti questi metodi possono essere inseriti in una classe. Ma dovremo codificare ogni metodo in modo che riconosca il tipo di nodo di cui si occupa in un determinato momento. E questo richiederà anche una risorsa... quindi non tutto è così chiaro....

Когда нужно использовать указатели в MQL5
Когда нужно использовать указатели в MQL5
  • 2010.03.25
  • MetaQuotes Software Corp.
  • www.mql5.com
Все объекты в MQL5 по умолчанию передаются по ссылке, но есть возможность использовать и указатели объектов. При этом есть опасность получить в качестве параметра функции указатель неинициализированного объекта. В этом случае работа программы будет завершена критически с последующей выгрузкой. Автоматически создаваемые объекты как правило такой ошибки не вызывают, и в этом отношении они достаточно безопасны. В этой статье мы попробуем разобраться в чем разница между ссылкой и указателей, когда оправдано использование указателей и как написать безопасный код с использованием указателей.
 
È bello vedere la giustizia prevalere almeno una volta ogni tanto. ))
 
denkir:
È chiaro che un particolare elenco comprende nodi omogenei. Intendevo dire che le relazioni tra i nodi di quell'elenco possono essere diverse, il che richiede un tipo di elenco diverso per ogni tipo di nodo. Se si potesse creare la stessa classe di lista per nodi di tipo diverso, sarebbe fantastico.... Personalmente non l'ho ancora provato..... Bisogna pensare al livello superiore di astrazione.....
È necessario un solo tipo di nodo. Vedere l'implementazione del CObject standard e l'implementazione delle collezioni CArray, CList, CTree: MQL5 Reference --> Standard Library --> Classes for Data Organisation.
Документация по MQL5: Стандартная библиотека
Документация по MQL5: Стандартная библиотека
  • www.mql5.com
Стандартная библиотека - Документация по MQL5
 
...è un sacco di lavoro. In pratica, chi me lo fa vedere?
 
denkir:

Quello che propone TheXpert sembra essere chiaro.

Se ho capito bene la sua idea, tutti i metodi di una lista astratta dovrebbero riconoscere automaticamente il "suo" nodo (questo è polimorfismo).

Nell'articolo, ad esempio, ci sono le classi utente CiSingleList (Fig.9), CDoubleList (Fig.11), CiUnrollDoubleList (Fig.12), CiCircleDoubleList (Fig.13).

Quindi, in linea di principio, tutti questi metodi possono essere inseriti in una classe. Ma dovremo codificare ogni metodo in modo che riconosca il tipo di nodo di cui si occupa in un determinato momento. E questo richiederà anche una risorsa... quindi non tutto è così chiaro...

Cosa c'è da codificare?

#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);
   }
}
Prima elementare, seconda media. Purtroppo non si può fare a meno di un intermediario comunitario, perché MQL5 ha un controllo dei tipi estremamente debole. Ma se avessimo a disposizione una funzione ClassToString come EnumToString(), tutto potrebbe essere organizzato in modo molto più elegante e semplice.