PLOです。アプリケーションの問題 - ページ 7 1234567891011121314...19 新しいコメント Yedelkin 2011.04.09 20:51 #61 equivalent23:もちろんです。 問題は、shapes[10]配列に CShapeから 派生したクラスのインスタンスを正しく 充填する方法であることに気がつきました。私が提案したオプションは、何らかの理由で機能しません。考えよう。 Aleksandr Chugunov 2011.04.09 21:15 #62 Yedelkin: 問題は、配列shapes[10]にCShapeから 派生したクラスのインスタンスをどのように正しく 埋めるかであることに気がつきました。私の提案したバリアントがなぜかうまくいきません。考えよう。配列はクラスポインタ型でなければならず、クラス型そのものであってはならない。そして、新しい演算 子を適用することができます。 Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new www.mql5.com Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5 equivalent23 2011.04.09 21:21 #63 AlexSTAL:配列は、クラスそのものではなく、クラスポインタ型でなければならない。そして、新しいオペレータを 適用することができます。例を挙げてみましょうか。ただ、私が挙げた例はドキュメントから引用したもので、どう動くべきかは不明なのですが...。 削除済み 2011.04.09 21:36 #64 Yedelkin: 問題は、配列shapes[10]にCShapeから 派生したクラスのインスタンスを正しく 埋める方法であることに気づきました。私の提案したバリアントがなぜかうまくいきません。考えよう。考えても考えなくても、100ルーブルはお金ではありません。この例は100パーセント不具合で、このような実装はよく考えられていないか、完成していないかのどちらかです。私自身がコードで実験した結果は引用せず、結論だけをお伝えします。1.オブジェクトをクラスとしてではなく、構造体として宣言すれば、簡単に配列に収まります。しかし、ビリギャラは取り除かなければならないので、配列が持つオブジェクトの種類(この場合はベースクラス)の機能しか使えません。2.2.ポインタとして宣言し、配列を形成することができます。a) ポインタがクリアされないと、メモリリークが発生する。b) また、子孫機能で正常に動作させることができない。追記正確には、ベースクラスで宣言された機能は、子孫クラスでも利用可能であり、見ることができるが、子孫クラスで登場したものはすべてアクセス不能である。 Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов www.mql5.com Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов - Документация по MQL5 Yedelkin 2011.04.09 21:36 #65 AlexSTAL: 配列はクラスへのポインタ型でなければならず、クラスそのものを表す型であってはならない。 そして、新しいオペレータを 適用することができます。 そうですね、ポインターを使うというのも、この方向で考えました。しかし、その場合、ドキュメントからの条件が満たされない。 "正方形(クラスCSquare)は辺で面積を計算し、円(クラスCCircle)は半径で面積を表現 し、といった具合です。CShape型のオブジェクトを格納するための配列を作成 し、その中にベースクラスのオブジェクトとそのすべての子孫を格納することができます。後で、この配列の任意の要素に対して同じ関数を呼び出すことができます。 ...正方形と円の面積を計算するには、m_radius と m_square_side のメンバに対応する値が必要なので、対応するクラスの宣言に SetRadius と SetSide() 関数を追加しています。こ れで Shape型の配列を宣言し、 そこに派生 クラスの オブジェクトを詰め 込むことができる...". 削除済み 2011.04.09 21:36 #66 AlexSTAL:配列はクラスへのポインタ型でなければならず、クラスそのものを表す型であってはならない。そして、新しいオペレータを 適用することができます。 正常に動作しない。アレイを形成することになるが。イェデルキン...正方形と円の面積を計算するには、m_radius と m_square_side のメンバに対応する値が必要なので、対応するクラスの宣言で SetRadius と SetSide() 関数を追加しています。あ とはShape型の配列を宣言して、その中に派生クラスのオブジェクトを詰めればいい......」。つまり、配列がベースクラス型である場合、その子孫の機能にはアクセスできないのです。だからこそ、3つの選択肢が見えてくるのです。1.アレイは(可能であれば)均質であるべきである。2.MQL5のOOPの考え方やアーキテクチャについてわからないことがあるのですが。3.開発者が例の実装に失敗したか、質問に対するフォローがなかったかのどちらか。 Aleksandr Chugunov 2011.04.09 21:38 #67 Interesting: 正常に動作しない。配列を形成することになりますが。 うまくいかないってどういうこと? Yedelkin 2011.04.09 21:39 #68 Interesting: 正確には、ベースクラスで宣言された機能は利用可能であり、同時にそれは子孫にも見えるが、子孫に現れたものはすべてアクセスできない。 うん、まさにその通りだ。 面白いですね。 例のものは100パー不具合です. このテーマについては、Handbookの著者からの回答が必要であることがわかった。 Aleksandr Chugunov 2011.04.09 21:48 #69 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; } 削除済み 2011.04.09 21:48 #70 AlexSTAL: 正常に動作しないってどういうこと?1.子孫機能は使用できません。誰がどのようにしたのかわかりませんが、個人的にはArrayからSetRadius()とSetSide()にアクセスしたことがありません。もしかしたら、autogenousで解決する方法があるかもしれませんが、私はそれをせずにやりたいと思っています。2.ポインターの扱いが間違っているのかもしれませんが、ずっと漏れがあるか、メインの作業が行われるブロックの中でポインターを正しく打たないといけないんです。 1234567891011121314...19 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
もちろんです。
問題は、配列shapes[10]にCShapeから 派生したクラスのインスタンスをどのように正しく 埋めるかであることに気がつきました。私の提案したバリアントがなぜかうまくいきません。考えよう。
配列はクラスポインタ型でなければならず、クラス型そのものであってはならない。
そして、新しい演算 子を適用することができます。
配列は、クラスそのものではなく、クラスポインタ型でなければならない。
そして、新しいオペレータを 適用することができます。
例を挙げてみましょうか。
ただ、私が挙げた例はドキュメントから引用したもので、どう動くべきかは不明なのですが...。
問題は、配列shapes[10]にCShapeから 派生したクラスのインスタンスを正しく 埋める方法であることに気づきました。私の提案したバリアントがなぜかうまくいきません。考えよう。
考えても考えなくても、100ルーブルはお金ではありません。
この例は100パーセント不具合で、このような実装はよく考えられていないか、完成していないかのどちらかです。
私自身がコードで実験した結果は引用せず、結論だけをお伝えします。
1.オブジェクトをクラスとしてではなく、構造体として宣言すれば、簡単に配列に収まります。しかし、ビリギャラは取り除かなければならないので、配列が持つオブジェクトの種類(この場合はベースクラス)の機能しか使えません。
2.2.ポインタとして宣言し、配列を形成することができます。
a) ポインタがクリアされないと、メモリリークが発生する。
b) また、子孫機能で正常に動作させることができない。
追記
正確には、ベースクラスで宣言された機能は、子孫クラスでも利用可能であり、見ることができるが、子孫クラスで登場したものはすべてアクセス不能である。
配列はクラスへのポインタ型でなければならず、クラスそのものを表す型であってはならない。
そして、新しいオペレータを 適用することができます。
そうですね、ポインターを使うというのも、この方向で考えました。しかし、その場合、ドキュメントからの条件が満たされない。
"正方形(クラスCSquare)は辺で面積を計算し、円(クラスCCircle)は半径で面積を表現 し、といった具合です。CShape型のオブジェクトを格納するための配列を作成 し、その中にベースクラスのオブジェクトとそのすべての子孫を格納することができます。後で、この配列の任意の要素に対して同じ関数を呼び出すことができます。
...正方形と円の面積を計算するには、m_radius と m_square_side のメンバに対応する値が必要なので、対応するクラスの宣言に SetRadius と SetSide() 関数を追加しています。こ れで Shape型の配列を宣言し、 そこに派生 クラスの オブジェクトを詰め 込むことができる...".
配列はクラスへのポインタ型でなければならず、クラスそのものを表す型であってはならない。
そして、新しいオペレータを 適用することができます。
イェデルキン
...正方形と円の面積を計算するには、m_radius と m_square_side のメンバに対応する値が必要なので、対応するクラスの宣言で SetRadius と SetSide() 関数を追加しています。あ とはShape型の配列を宣言して、その中に派生クラスのオブジェクトを詰めればいい......」。
つまり、配列がベースクラス型である場合、その子孫の機能にはアクセスできないのです。
だからこそ、3つの選択肢が見えてくるのです。
1.アレイは(可能であれば)均質であるべきである。
2.MQL5のOOPの考え方やアーキテクチャについてわからないことがあるのですが。
3.開発者が例の実装に失敗したか、質問に対するフォローがなかったかのどちらか。
正常に動作しない。配列を形成することになりますが。
正確には、ベースクラスで宣言された機能は利用可能であり、同時にそれは子孫にも見えるが、子孫に現れたものはすべてアクセスできない。
うん、まさにその通りだ。
例のものは100パー不具合です.
このテーマについては、Handbookの著者からの回答が必要であることがわかった。
正常に動作しない。配列を形成することになりますが。
このとき、配列が基底クラス型であると、その子孫の機能を利用することができません。つまり、SetRadius() や SetSide() が利用できなくなります。
だからこそ、3つの選択肢が見えてくるのです。
1.アレイは(可能であれば)均質であるべきである。
2.MQL5のOOPの考え方やアーキテクチャについてわからないことがあるのですが。
3.開発者がうまくいかない例を裏切ってしまったか、課題をクリアしていないかのどちらか。
実行する。
もっとシンプルな方法でできるはずなのに...。仮想化によって
正常に動作しないってどういうこと?
1.子孫機能は使用できません。誰がどのようにしたのかわかりませんが、個人的にはArrayからSetRadius()とSetSide()にアクセスしたことがありません。もしかしたら、autogenousで解決する方法があるかもしれませんが、私はそれをせずにやりたいと思っています。
2.ポインターの扱いが間違っているのかもしれませんが、ずっと漏れがあるか、メインの作業が行われるブロックの中でポインターを正しく打たないといけないんです。