//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
//--- объявим массив указателей объектов базового типа
CShape *shapes[5]; // массив указателей на объекты CShape//--- здесь заполняем массив производными объектами//--- объявим указатель на объект типа CCircle
CCircle *circle=new CCircle();
//--- задаем свойства объекта по указателю circle
circle.SetRadius(2.5);
//--- поместим в shapes[0] значение указателя
shapes[0]=circle;
//--- создаем еще один объект CCircle и запишем его указатель в shapes[1]
circle=new CCircle();
shapes[1]=circle;
circle.SetRadius(5);
//--- тут мы намеренно "забыли" задать значение для shapes[2]//circle=new CCircle();//circle.SetRadius(10);//shapes[2]=circle;//--- для неиспользуемого элемента установим значение NULL
shapes[2]=NULL;
//--- создаем объект CSquare и запишем его указатель в shapes[3]
CSquare *square=new CSquare();
square.SetSide(5);
shapes[3]=square;
//--- создаем объект CSquare и запишем его указатель в shapes[4]
square=new CSquare();
square.SetSide(10);
shapes[4]=square;
//--- массив указателей есть, получим его размерint total=ArraySize(shapes);
//--- пройдем в цикле по всем указателям в массиве for(int i=0; i<5;i++)
{
//--- если по указанному индексу указатель является валиднымif(CheckPointer(shapes[i])!=POINTER_INVALID)
{
//--- выведем в лог тип и площадь фигурыPrintFormat("Объект типа %d имеет площадь %G",
shapes[i].GetType(),
shapes[i].GetArea());
}
//--- если указатель имеет тип POINTER_INVALIDelse
{
//--- сообщим об ошибкеPrintFormat("Объект shapes[%d] не инициализирован! Его указатель %s",
i,EnumToString(CheckPointer(shapes[i])));
}
}
//--- мы должны самостоятельно уничтожить все созданные динамические объектыfor(int i=0;i<total;i++)
{
//--- удалять можно только объекты, чей указатель имеет тип POINTER_DYNAMICif(CheckPointer(shapes[i])==POINTER_DYNAMIC)
{
//--- сообщим об удаленииPrintFormat("Удаляем shapes[%d]",i);
//--- уничтожим объект по его указателюdelete shapes[i];
}
}
}
読めたらどんなにいいか...。:)
また、これらのアプローチは、(タイプが異なるとはいえ)1つのパラメータのみの転送/読み取りで計算されると理解していますが、悪いアプローチではありません。
しかし、パラメータがたくさんあって、そのすべてをベースクラスに入れることができない場合、どのように解決すればいいのでしょうか?
私が理解する限り、渡すパラメータのインデックスを入力する必要があります(インデックスでパラメータを格納した配列をクラスで作成することもできます)?
私もよくわからないのですが...。
この例では、インデックスがありますが、明示的な数値ではなく、列挙型です...。
忘れてください、そんな価値ないですよ。
Interesting:
一般的には、問題点を議論した後、https://www.mql5.com/ru/forum/3566/page6#comment_58280、SRにアプリケーションを送った。
1.どうだろう、どうだろう。
開発者が、セキュリティのために機能を犠牲にしてまで、一定の措置を取るとは思えません(一方では当然のことですが)。
報告すること。
アプリケーションはこんな感じでした。提案します。
1.ポリモーフィズム」ハンドブックの「ポリモーフィズム」のセクションを、CShapeから派生したクラスのインスタンスで配列シェイプ[10]を正しく埋める方法を指定する点で明確にしなさい(例を挙げなさい)。
2.文字列が正しく書かれているか確認する。
3.クラスを宣言するとき、宣言されるクラス名の直後に中括弧を付けるかどうかを説明しなさい。
クラス CShape{};
class CCircle{} :public CShape.
class CSquare{} :public CShape.
対応する。
ヘルプに拡張説明が追加される予定ですが、ここではその抜粋を紹介します。
このプログラムでは、1つの基本型CShapeを継承した異なる型(CCircleとCSquare)のオブジェクトを使用することを想定しています。ポリモーフィズムにより、基本型CShapeのオブジェクトの配列を作ることができますが、この配列を宣言しても、オブジェクト自体は未知で型も未定義です。
配列の各要素にどの種類のオブジェクトを入れるかは、プログラムの実行中に決定される。これは、対応するクラスのオブジェクトが動的に生成されることを意味し、したがって、オブジェクトそのものではなく、オブジェクトポインタを使用する必要がある。
オブジェクトを動的に生成するには、newオペレータを使用する。そのようなオブジェクトは、それぞれ独立して、明示的にdeleteオペレータで削除する必要がある。そこで、サンプルスクリプトのように、CShape型のポインタの配列を宣言し、その要素(new_class_name)ごとに必要な型のオブジェクトを作成することにします。
delete演算子でオブジェクトを削除する場合、そのポインタの型を確認する必要があることに注意してください。ポインタ POINTER_DYNAMIC を持つオブジェクトのみ削除可能で、それ以外の型のポインタはエラーになります。
投稿ありがとうございます。№2、№3を修正しました。新しいバージョンのヘルプに掲載される予定です
質問です。標準ライブラリは、以下の行を使用します。
リファレンスマニュアルには、「const 指定子は、構造体やクラスのメンバには適用されない」とあります。上記のクラスメソッドでconstを 使用することは、どのような意味があり、そのような場合の使用ルールはどのようなものでしょうか?
Yedelkin:
上記のクラスメソッドにおける constの 使用は、どのような意味を持ち、このような場合に使用するためのルールは何でしょうか?
質問です。標準ライブラリは、以下の行を使用します。
リファレンスマニュアルには、「const 指定子は、構造体やクラスのメンバには適用されない」とあります。上記のクラスメソッドでconstを 使用することは、どのような意味があり、そのような場合の使用ルールはどのようなものでしょうか?
構造体/クラスのメンバと、メソッドは別物です。
constと記述されたメソッドは、そのクラスの状態/メンバを変更しないことを意味します。つまり、このようなメソッドを呼び出した後、クラスの内部状態は変化しない。これは、クラスのメンバを変更しようとする試みをチェックするよう、コンパイラに追加で指示するために使用されます。
構造体/クラスメンバと メソッドは別物です。
constと記述されたメソッドは、そのクラスの状態/メンバを変更しないことを意味します。つまり、このメソッドが呼ばれた後も、クラスの内部状態は変化しない。これは、クラスのメンバを変更しようとする試みをチェックするよう、コンパイラに追加で指示するために使用されます。
すごい。ありがとうございました。そして、頭を悩ませました。
ところで、ついでに論理的な質問なのですが、マニュアルはなく、期待できないのでしょうか?
どのような使い方ができるのでしょうか?スレッド同士が相互作用しないからです。
もし、スレッド間で自由にデータを転送できるのであれば、たしかにそのような命令は必要でしょう。
こんにちは。
そんな問いかけ。
上のコードについて
何がいけなかったのか、それともMT5では一般的に実現不可能なのか?
ファイル名変数で上書きされた名前を取得したいのですが。