記事"MQL5プログラミングベージックス:リスト"についてのディスカッション - ページ 6

 
papaklass:

皆さん、本質的な議論をしませんか?:)

正しいシートは、任意のクラスに新しいクラスを使用するために明示的な実装を必要とすべきではない。

したがって、正しい実装はテンプレートに依存すべきです。

公平を期すために、私はこれが提示されたテンプレート・レベルで実現可能かどうかわからない。

しかし、それは記事の問題点からはかけ離れている。

 
TheXpert:


正しいリストは、それを任意のクラスに使用するために、新しいクラスの明示的な実装を必要とすべきではない...。

ノード(リスト要素)間の型や接続方法が異なっていても、リストは同じ実装を持つべき、つまり同じデータ型を 参照すべき、というのが私の正しい理解でしょうか?条件付きCListは、異なるタイプのノード(CSingleNode、CDoubleNodeなど)を含むべきです...
 
denkir:
条件付きで、CListは異なるタイプのノードを含むべきだ...。

なぜですか?)コンテナは同種のオブジェクトの集合である。

オブジェクト自体の違いは、すでにあるオブジェクト内のポリモーフィズムによって 実現することができ、リストとは何の関係もない。

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

なぜか?)コンテナは均質なオブジェクトの集合である。

オブジェクト自体の違いは、すでにあるオブジェクト内のポリモーフィズムによって 実現でき、リストとは何の関係もない。

具体的なリストが同種のノードを含むことは明らかです。私が言いたかったのは、そのリストに含まれるノード間の関係が異なる可能性があるということであり、そのためにはノードの種類ごとに異なるリスト型が必要になるということだ。異なるタイプのノードに対して同じリスト・クラスを 作成できるなら、それは素晴らしいことですが......。私自身はまだ試していませんが......。より高い抽象度を考える必要がある。
 
TheXpert:

正しいシートは、任意のクラスに新しいクラスを使用するために、明示的な実装を必要とすべきではない。

したがって、正しい実装はテンプレートに依存すべきである。

公平を期すために、私はこれが提示されたテンプレート・レベルで実現可能かどうか確信が持てない。

しかし、それは実は記事の問題点とはかけ離れている。

認めたくはないが、専門家の言う通りだ。理想的には、リーフ・クラスはテンプレートに実装されるべきである。標準的なCListはCObject.
 

TheXpertが 提案していることは明確なようだ。

彼の考えを正しく理解すれば、ある抽象的なリストのすべてのメソッドは自動的に「その」ノードを認識するはずです(これがポリモーフィズム です)。

例えば、この記事にはCiSingleList(図9)、CDoubleList(図11)、 CiUnrollDoubleList(図12)、 CiCircleDoubleList (図13)というユーザー・クラスがある。

つまり、原理的には、これらすべてを1つのクラスに詰め込むことができる。しかし、各メソッドが特定の瞬間に扱うノードのタイプを認識できるようにコーディングしなければならない。そしてこれにはリソースも必要になる...。というわけで、すべてがそれほど明快に決まっているわけではないのだが......。

Когда нужно использовать указатели в MQL5
Когда нужно использовать указатели в MQL5
  • 2010.03.25
  • MetaQuotes Software Corp.
  • www.mql5.com
Все объекты в MQL5 по умолчанию передаются по ссылке, но есть возможность использовать и указатели объектов. При этом есть опасность получить в качестве параметра функции указатель неинициализированного объекта. В этом случае работа программы будет завершена критически с последующей выгрузкой. Автоматически создаваемые объекты как правило такой ошибки не вызывают, и в этом отношении они достаточно безопасны. В этой статье мы попробуем разобраться в чем разница между ссылкой и указателей, когда оправдано использование указателей и как написать безопасный код с использованием указателей.
 
たまには正義が勝つのを見るのもいいものだ。))
 
denkir:
特定のリストが同種のノードを含むことは明らかです。私が言いたかったのは、そのリストに含まれるノード間の関係は異なる可能性があり、ノードのタイプごとに異なるリスト・タイプが必要になるということです。異なるタイプのノードに対して同じリスト・クラスを 作成できるなら、それは素晴らしいことですが......。私自身はまだ試していませんが......。より抽象度の高いものを考える必要がある......。
ノードタイプは1つだけでいい。標準的なCObjectの実装とCArray, CList, CTreeコレクションの実装は、MQL5 Reference -->Standard Library--> Classes for Data Organisationを参照してください。
Документация по MQL5: Стандартная библиотека
Документация по MQL5: Стандартная библиотека
  • www.mql5.com
Стандартная библиотека - Документация по MQL5
 
...は大変な仕事だ。実際、誰が見せてくれるんだ?
 
denkir:

TheXpertが 提案していることは明確なようだ。

彼の考えを正しく理解すれば、ある抽象的なリストのすべてのメソッドは自動的に「その」ノードを認識するはずです(これがポリモーフィズム です)。

例えば、この記事にはCiSingleList(図9)、CDoubleList(図11)、 CiUnrollDoubleList(図12)、 CiCircleDoubleList (図13)というユーザー・クラスがある。

つまり、原理的には、これらすべてを1つのクラスに詰め込むことができる。しかし、各メソッドが特定の瞬間に扱うノードのタイプを認識できるようにコーディングしなければならない。そしてこれにはリソースも必要になる...。というわけで、すべてがそんなに明快なわけではないのだ...。

何をコーディングすればいいんだ?

#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);
   }
}
1年生、2年生。残念ながら、MQL5では型制御が極めて弱いため、Communityの仲介なしではできない。しかし、もしEnumToString()のようなClassToString関数が自由に使えたら、すべてをもっとエレガントに、簡単にまとめることができるだろう。