"MQL5 Programlama Temelleri: Listeler" makalesi için tartışma - sayfa 6

 
papaklass:

Beyler, neden esaslı bir tartışma yapmaya çalışmıyoruz? :)

Doğru bir sayfa, rastgele bir sınıf için kullanmak üzere yeni bir sınıfın açık bir şekilde uygulanmasını gerektirmemelidir.

Bu nedenle, doğru uygulama şablonlara dayanmalıdır.

Adil olmak gerekirse, bunun sunulan şablon seviyesinde gerçekleştirilebilir olduğundan emin değilim.

Ancak bu aslında makaledeki sorunlardan çok uzak.

 
TheXpert:


Doğru bir liste, rastgele bir sınıf için kullanmak üzere yeni bir sınıfın açık bir şekilde uygulanmasını gerektirmemelidir...

Düğümler (liste elemanları) farklı tipte ve aralarında bağlantı yolu olsa bile, listenin yine de aynı uygulamaya sahip olması, yani aynı veri tipine başvurması gerektiğini doğru anlıyor muyum? Koşullu olarak CList farklı tipte düğümler içermelidir (CSingleNode, CDoubleNode, vb.)...
 
denkir:
Koşullu olarak, CList farklı türde düğümler içermelidir....

Neden? ) Bir konteyner homojen nesnelerden oluşan bir kümedir.

Nesnelerin farklılığı, zaten nesneler içindeki polimorfizm ile gerçekleştirilebilir ve listeyle hiçbir ilgisi yoktur.

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

Neden? ) Bir konteyner homojen nesnelerden oluşan bir kümedir.

Nesnelerin farklılığı, zaten nesneler içindeki çok biçimlilik ile gerçekleştirilebilir ve listeyle hiçbir ilgisi yoktur.

Somut bir listenin homojen düğümler içerdiği açıktır. Demek istediğim, bu listedeki düğümler arasındaki ilişkilerin farklı olabileceğiydi, bu da her düğüm türü için farklı bir liste türü gerektirir. Farklı türlerdeki düğümler için aynı liste sınıfını oluşturabilirseniz, bu harika olur.... Ben şahsen bunu henüz denemedim..... Daha yüksek soyutlama seviyesi hakkında düşünmek gerekiyor.....
 
TheXpert:

Doğru bir sayfa, rastgele bir sınıf için kullanmak üzere yeni bir sınıfın açık bir şekilde uygulanmasını gerektirmemelidir.

Bu nedenle, doğru uygulama şablonlara dayanmalıdır.

Adil olmak gerekirse, bunun sunulan şablon düzeyinde gerçekleştirilebilir olduğundan emin değilim.

Ancak bu aslında makaledeki sorunlardan çok uzak.

İtiraf etmekten nefret ettiğim gibi, uzman burada haklı. İdeal olarak, yaprak sınıfı şablonlar üzerinde uygulanmalıdır. Standart CList CObject üzerinde uygulanmasına rağmen.
 

TheXpert' in önerdiği şey açık gibi görünüyor.

Fikrini doğru anladıysam, bazı soyut listelerin tüm metotları otomatik olarak "kendi" düğümünü tanımalıdır (bu polimorfizmdir).

Örneğin makalede CiSingleList (Şekil 9), CDoubleList (Şekil 11), CiUnrollDoubleList (Şekil 12), CiCircleDoubleList (Şekil 13) kullanıcı sınıfları var.

Yani, prensip olarak, hepsi tek bir sınıfa doldurulabilir. Ancak her bir yöntemi, belirli bir anda ilgilendiği düğüm türünü tanıyacak şekilde kodlamamız gerekecektir. Ve bu da bir kaynak gerektirecektir... Yani her şey bu kadar net değil....

Когда нужно использовать указатели в MQL5
Когда нужно использовать указатели в MQL5
  • 2010.03.25
  • MetaQuotes Software Corp.
  • www.mql5.com
Все объекты в MQL5 по умолчанию передаются по ссылке, но есть возможность использовать и указатели объектов. При этом есть опасность получить в качестве параметра функции указатель неинициализированного объекта. В этом случае работа программы будет завершена критически с последующей выгрузкой. Автоматически создаваемые объекты как правило такой ошибки не вызывают, и в этом отношении они достаточно безопасны. В этой статье мы попробуем разобраться в чем разница между ссылкой и указателей, когда оправдано использование указателей и как написать безопасный код с использованием указателей.
 
En azından arada bir adaletin galip geldiğini görmek güzel. ))
 
denkir:
Belirli bir listenin homojen düğümler içerdiği açıktır. Demek istediğim, bu listedeki düğümler arasındaki ilişkilerin farklı olabileceğiydi, bu da her düğüm türü için farklı bir liste türü gerektirir. Farklı türlerdeki düğümler için aynı liste sınıfını oluşturabilirseniz, bu harika olur.... Ben şahsen bunu henüz denemedim..... Daha yüksek soyutlama seviyesi hakkında düşünmeniz gerekiyor.....
Sadece bir düğüm tipine ihtiyacınız var. Standart CObject uygulamasına ve CArray, CList, CTree koleksiyonlarının uygulamasına bakın: MQL5 Reference --> Standard Library --> Classes for Data Organisation.
Документация по MQL5: Стандартная библиотека
Документация по MQL5: Стандартная библиотека
  • www.mql5.com
Стандартная библиотека - Документация по MQL5
 
...çok iş var. Pratik olarak, bana kim gösterecek?
 
denkir:

TheXpert' in önerdiği şey açık gibi görünüyor.

Fikrini doğru anladıysam, bazı soyut listelerin tüm metotları otomatik olarak "kendi" düğümünü tanımalıdır (bu polimorfizmdir).

Örneğin makalede CiSingleList (Şekil 9), CDoubleList (Şekil 11), CiUnrollDoubleList (Şekil 12), CiCircleDoubleList (Şekil 13) kullanıcı sınıfları var.

Yani, prensip olarak, hepsi tek bir sınıfa doldurulabilir. Ancak her yöntemi, belirli bir anda ilgilendiği düğüm türünü tanıyacak şekilde kodlamamız gerekecektir. Ve bu da bir kaynak gerektirecektir. Yani her şey o kadar net değil.

Kodlanacak ne var?

#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);
   }
}
Birinci sınıf, ikinci çeyrek. Ne yazık ki, bir Topluluk aracısı olmadan yapamazsınız, çünkü MQL5 son derece zayıf tip kontrolüne sahiptir. Ancak elimizde EnumToString() gibi bir ClassToString fonksiyonu olsaydı, her şey çok daha zarif ve kolay bir şekilde organize edilebilirdi.