PLOです。アプリケーションの問題 - ページ 7

 
equivalent23:

もちろんです。

問題は、shapes[10]配列に CShapeから 派生したクラスのインスタンスを正しく 充填する方法であることに気がつきました。私が提案したオプションは、何らかの理由で機能しません。考えよう。
 
Yedelkin:
問題は、配列shapes[10]にCShapeから 派生したクラスのインスタンスをどのように正しく 埋めるかであることに気がつきました。私の提案したバリアントがなぜかうまくいきません。考えよう。

配列はクラスポインタ型でなければならず、クラス型そのものであってはならない。

そして、新しい演算 子を適用することができます。

Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5
 
AlexSTAL:

配列は、クラスそのものではなく、クラスポインタ型でなければならない。

そして、新しいオペレータを 適用することができます。

例を挙げてみましょうか。

ただ、私が挙げた例はドキュメントから引用したもので、どう動くべきかは不明なのですが...。

 
Yedelkin:
問題は、配列shapes[10]にCShapeから 派生したクラスのインスタンスを正しく 埋める方法であることに気づきました。私の提案したバリアントがなぜかうまくいきません。考えよう。

考えても考えなくても、100ルーブルはお金ではありません。

この例は100パーセント不具合で、このような実装はよく考えられていないか、完成していないかのどちらかです。

私自身がコードで実験した結果は引用せず、結論だけをお伝えします。

1.オブジェクトをクラスとしてではなく、構造体として宣言すれば、簡単に配列に収まります。しかし、ビリギャラは取り除かなければならないので、配列が持つオブジェクトの種類(この場合はベースクラス)の機能しか使えません。

2.2.ポインタとして宣言し、配列を形成することができます。

a) ポインタがクリアされないと、メモリリークが発生する。

b) また、子孫機能で正常に動作させることができない。

追記

正確には、ベースクラスで宣言された機能は、子孫クラスでも利用可能であり、見ることができるが、子孫クラスで登場したものはすべてアクセス不能である。

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов - Документация по MQL5
 
AlexSTAL:

配列はクラスへのポインタ型でなければならず、クラスそのものを表す型であってはならない。

そして、新しいオペレータを 適用することができます。

そうですね、ポインターを使うというのも、この方向で考えました。しかし、その場合、ドキュメントからの条件が満たされない。

"正方形(クラスCSquare)は辺で面積を計算し、円(クラスCCircle)は半径で面積を表現 し、といった具合です。CShape型のオブジェクトを格納するための配列を作成 し、その中にベースクラスのオブジェクトとそのすべての子孫を格納することができます。後で、この配列の任意の要素に対して同じ関数を呼び出すことができます。

...正方形と円の面積を計算するには、m_radius と m_square_side のメンバに対応する値が必要なので、対応するクラスの宣言に SetRadius と SetSide() 関数を追加しています。こ れで Shape型の配列を宣言し、 そこに派生 クラスの オブジェクトを詰め 込むことができる...".

 
AlexSTAL:

配列はクラスへのポインタ型でなければならず、クラスそのものを表す型であってはならない。

そして、新しいオペレータを 適用することができます。

正常に動作しない。アレイを形成することになるが。

イェデルキン

...正方形と円の面積を計算するには、m_radius と m_square_side のメンバに対応する値が必要なので、対応するクラスの宣言で SetRadius と SetSide() 関数を追加しています。あ とはShape型の配列を宣言して、その中に派生クラスのオブジェクトを詰めればいい......」。

つまり、配列がベースクラス型である場合、その子孫の機能にはアクセスできないのです。

だからこそ、3つの選択肢が見えてくるのです。

1.アレイは(可能であれば)均質であるべきである。

2.MQL5のOOPの考え方やアーキテクチャについてわからないことがあるのですが。

3.開発者が例の実装に失敗したか、質問に対するフォローがなかったかのどちらか。

 
Interesting:
正常に動作しない。配列を形成することになりますが。
うまくいかないってどういうこと?
 
Interesting:

正確には、ベースクラスで宣言された機能は利用可能であり、同時にそれは子孫にも見えるが、子孫に現れたものはすべてアクセスできない

うん、まさにその通りだ。

面白いですね

例のものは100パー不具合です.

このテーマについては、Handbookの著者からの回答が必要であることがわかった。

 
Interesting:
正常に動作しない。配列を形成することになりますが。

このとき、配列が基底クラス型であると、その子孫の機能を利用することができません。つまり、SetRadius() や SetSide() が利用できなくなります。

だからこそ、3つの選択肢が見えてくるのです。

1.アレイは(可能であれば)均質であるべきである。

2.MQL5のOOPの考え方やアーキテクチャについてわからないことがあるのですが。

3.開発者がうまくいかない例を裏切ってしまったか、課題をクリアしていないかのどちらか。

実行する。

class CBase
  {
public:
   void m_radius() {Print("CBase");}
  };

class CTest : public CBase
  {
public:
   void m_radius() {Print("CTest");}
  };

CBase* Base;

void OnStart()
  {
   Base = new CTest;
   Base.m_radius();
   ((CTest *)Base).m_radius();
   delete Base;
  }

もっとシンプルな方法でできるはずなのに...。仮想化によって

class CBase
  {
public:
   virtual void m_radius() {Print("CBase");}
  };

class CTest : public CBase
  {
public:
   virtual void m_radius() {Print("CTest");}
  };

CBase* Base;

void OnStart()
  {
   Base = new CTest;
   Base.m_radius();
   delete Base;
  }
 
AlexSTAL:
正常に動作しないってどういうこと?

1.子孫機能は使用できません。誰がどのようにしたのかわかりませんが、個人的にはArrayからSetRadius()とSetSide()にアクセスしたことがありません。もしかしたら、autogenousで解決する方法があるかもしれませんが、私はそれをせずにやりたいと思っています。

2.ポインターの扱いが間違っているのかもしれませんが、ずっと漏れがあるか、メインの作業が行われるブロックの中でポインターを正しく打たないといけないんです。