Все объекты в MQL5 по умолчанию передаются по ссылке, но есть возможность использовать и указатели объектов. При этом есть опасность получить в качестве параметра функции указатель неинициализированного объекта. В этом случае работа программы будет завершена критически с последующей выгрузкой. Автоматически создаваемые объекты как правило такой ошибки не вызывают, и в этом отношении они достаточно безопасны. В этой статье мы попробуем разобраться в чем разница между ссылкой и указателей, когда оправдано использование указателей и как написать безопасный код с использованием указателей.
Все объекты в MQL5 по умолчанию передаются по ссылке, но есть возможность использовать и указатели объектов. При этом есть опасность получить в качестве параметра функции указатель неинициализированного объекта. В этом случае работа программы будет завершена критически с последующей выгрузкой. Автоматически создаваемые объекты как правило такой ошибки не вызывают, и в этом отношении они достаточно безопасны. В этой статье мы попробуем разобраться в чем разница между ссылкой и указателей, когда оправдано использование указателей и как написать безопасный код с использованием указателей.
#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(){return90;}
};
class Animal : public Community
{
public:
Animal() : Community(ANIMAL){;}
int CountLegs(){return4;}
};
class Car : public Community
{
public:
Car() : Community(CAR){;}
int Speed(){return20;}
};
voidOnStart()
{
CArrayObj elements;
CObject* object = NULL;
while(elements.Total() < 100)
{
switch(rand()%3)
{
case HUMAN:
object = new Human();
break;
caseANIMAL:
object = new Animal();
break;
caseCAR:
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);
}
}
皆さん、本質的な議論をしませんか?:)
正しいシートは、任意のクラスに新しいクラスを使用するために明示的な実装を必要とすべきではない。
したがって、正しい実装はテンプレートに依存すべきです。
公平を期すために、私はこれが提示されたテンプレート・レベルで実現可能かどうかわからない。
しかし、それは記事の問題点からはかけ離れている。
正しいリストは、それを任意のクラスに使用するために、新しいクラスの明示的な実装を必要とすべきではない...。
条件付きで、CListは異なるタイプのノードを含むべきだ...。
なぜですか?)コンテナは同種のオブジェクトの集合である。
オブジェクト自体の違いは、すでにあるオブジェクト内のポリモーフィズムによって 実現することができ、リストとは何の関係もない。
なぜか?)コンテナは均質なオブジェクトの集合である。
オブジェクト自体の違いは、すでにあるオブジェクト内のポリモーフィズムによって 実現でき、リストとは何の関係もない。
正しいシートは、任意のクラスに新しいクラスを使用するために、明示的な実装を必要とすべきではない。
したがって、正しい実装はテンプレートに依存すべきである。
公平を期すために、私はこれが提示されたテンプレート・レベルで実現可能かどうか確信が持てない。
しかし、それは実は記事の問題点とはかけ離れている。
TheXpertが 提案していることは明確なようだ。
彼の考えを正しく理解すれば、ある抽象的なリストのすべてのメソッドは自動的に「その」ノードを認識するはずです(これがポリモーフィズム です)。
例えば、この記事にはCiSingleList(図9)、CDoubleList(図11)、 CiUnrollDoubleList(図12)、 CiCircleDoubleList (図13)というユーザー・クラスがある。
つまり、原理的には、これらすべてを1つのクラスに詰め込むことができる。しかし、各メソッドが特定の瞬間に扱うノードのタイプを認識できるようにコーディングしなければならない。そしてこれにはリソースも必要になる...。というわけで、すべてがそれほど明快に決まっているわけではないのだが......。
特定のリストが同種のノードを含むことは明らかです。私が言いたかったのは、そのリストに含まれるノード間の関係は異なる可能性があり、ノードのタイプごとに異なるリスト・タイプが必要になるということです。異なるタイプのノードに対して同じリスト・クラスを 作成できるなら、それは素晴らしいことですが......。私自身はまだ試していませんが......。より抽象度の高いものを考える必要がある......。
TheXpertが 提案していることは明確なようだ。
彼の考えを正しく理解すれば、ある抽象的なリストのすべてのメソッドは自動的に「その」ノードを認識するはずです(これがポリモーフィズム です)。
例えば、この記事にはCiSingleList(図9)、CDoubleList(図11)、 CiUnrollDoubleList(図12)、 CiCircleDoubleList (図13)というユーザー・クラスがある。
つまり、原理的には、これらすべてを1つのクラスに詰め込むことができる。しかし、各メソッドが特定の瞬間に扱うノードのタイプを認識できるようにコーディングしなければならない。そしてこれにはリソースも必要になる...。というわけで、すべてがそんなに明快なわけではないのだ...。
何をコーディングすればいいんだ?
1年生、2年生。残念ながら、MQL5では型制御が極めて弱いため、Communityの仲介なしではできない。しかし、もしEnumToString()のようなClassToString関数が自由に使えたら、すべてをもっとエレガントに、簡単にまとめることができるだろう。