Discussão do artigo "Fundamentos básicos da Programação MQL5: Lista" - página 6

 
papaklass:

Senhores, por que não tentamos ter uma discussão substantiva? :)

Uma planilha correta não deve exigir a implementação explícita de uma nova classe para usá-la em uma classe arbitrária.

Portanto, a implementação correta deve se basear em modelos.

Para ser justo, não tenho certeza de que isso seja possível no nível de modelo apresentado.

Mas, na verdade, isso está muito longe dos problemas do artigo.

 
TheXpert:


Uma lista correta não deve exigir a implementação explícita de uma nova classe para usá-la em uma classe arbitrária...

Entendi corretamente que, mesmo que os nós (elementos da lista) tenham tipos e formas de conexão diferentes entre si, a lista ainda deve ter a mesma implementação, ou seja, referir-se ao mesmo tipo de dados? Condicionalmente, a CList deve incluir diferentes tipos de nós (CSingleNode, CDoubleNode, etc.)...
 
denkir:
Condicionalmente, a CList deve incluir diferentes tipos de nós....

Por quê? ) Um contêiner é um conjunto de objetos homogêneos.

A diferença dos objetos em si pode ser realizada pelo polimorfismo dentro dos próprios objetos e não tem nada a ver com a lista.

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

Por quê? ) Um contêiner é um conjunto de objetos homogêneos.

A diferença dos próprios objetos pode ser realizada pelo polimorfismo dentro dos próprios objetos e não tem nada a ver com a lista.

Está claro que uma lista concreta inclui nós homogêneos. O que eu quis dizer é que as relações entre os nós dessa lista podem ser diferentes, o que exige um tipo de lista diferente para cada tipo de nó. Se você pudesse criar a mesma classe de lista para nós de tipos diferentes, isso seria ótimo.... Eu mesmo ainda não tentei fazer isso..... É preciso pensar em um nível mais alto de abstração.....
 
TheXpert:

Uma planilha correta não deve exigir a implementação explícita de uma nova classe para poder usá-la em uma classe arbitrária.

Portanto, a implementação correta deve se basear em modelos.

Para ser justo, não tenho certeza de que isso seja possível no nível de modelo apresentado.

Mas isso, na verdade, está muito longe dos problemas do artigo.

Como odeio admitir, o especialista está certo aqui. Idealmente, a classe leaf deveria ser implementada em modelos. Embora o CList padrão seja implementado no CObject.
 

O que TheXpert propõe parece ser claro.

Se entendi corretamente sua ideia, todos os métodos de alguma lista abstrata devem reconhecer automaticamente "seu" nó (isso é polimorfismo).

No artigo, por exemplo, há classes de usuário CiSingleList (Fig.9), CDoubleList (Fig.11), CiUnrollDoubleList (Fig.12), CiCircleDoubleList (Fig.13).

Portanto, em princípio, todos eles podem ser colocados em uma única classe. Mas teremos de codificar cada método para que ele reconheça o tipo de nó com o qual está lidando em um determinado momento. E isso também exigirá um recurso... portanto, nem tudo é tão claro....

Когда нужно использовать указатели в MQL5
Когда нужно использовать указатели в MQL5
  • 2010.03.25
  • MetaQuotes Software Corp.
  • www.mql5.com
Все объекты в MQL5 по умолчанию передаются по ссылке, но есть возможность использовать и указатели объектов. При этом есть опасность получить в качестве параметра функции указатель неинициализированного объекта. В этом случае работа программы будет завершена критически с последующей выгрузкой. Автоматически создаваемые объекты как правило такой ошибки не вызывают, и в этом отношении они достаточно безопасны. В этой статье мы попробуем разобраться в чем разница между ссылкой и указателей, когда оправдано использование указателей и как написать безопасный код с использованием указателей.
 
É bom ver a justiça prevalecer pelo menos de vez em quando. ))
 
denkir:
Está claro que uma determinada lista inclui nós homogêneos. O que eu quis dizer é que as relações entre os nós dessa lista podem ser diferentes, o que exige um tipo de lista diferente para cada tipo de nó. Se você pudesse criar a mesma classe de lista para nós de tipos diferentes, isso seria ótimo.... Eu mesmo ainda não tentei fazer isso..... É preciso pensar em um nível mais alto de abstração.....
Você só precisa de um tipo de nó. Consulte a implementação do CObject padrão e a implementação das coleções CArray, CList e CTree: MQL5 Reference --> Standard Library --> Classes for Data Organisation.
Документация по MQL5: Стандартная библиотека
Документация по MQL5: Стандартная библиотека
  • www.mql5.com
Стандартная библиотека - Документация по MQL5
 
...é muito trabalhoso. Na prática, quem vai me mostrar?
 
denkir:

O que TheXpert propõe parece ser claro.

Se eu entendi sua ideia corretamente, todos os métodos de alguma lista abstrata devem reconhecer automaticamente "seu" nó (isso é polimorfismo).

No artigo, por exemplo, há classes de usuário CiSingleList (Fig.9), CDoubleList (Fig.11), CiUnrollDoubleList (Fig.12), CiCircleDoubleList (Fig.13).

Portanto, em princípio, todos eles podem ser colocados em uma única classe. Mas teremos de codificar cada método para que ele reconheça o tipo de nó com o qual está lidando em um determinado momento. E isso também exigirá um recurso... portanto, nem tudo é tão claro...

O que há para codificar?

#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);
   }
}
Primeira série, segundo trimestre. Infelizmente, não é possível passar sem um intermediário Community, porque a MQL5 tem um controle de tipos extremamente fraco. Mas se tivéssemos uma função ClassToString como EnumToString() à nossa disposição, tudo poderia ser organizado de forma muito mais elegante e fácil.