MQL5におけるOOPに関する質問 - ページ 12

 
Vasiliy Pushkaryov:

別件で一言。CButtonから子クラスCMyButtonを作れば、ボタンを作成した後、クラスの外でそのプロパティを変更することができます。以下はOnInit()で行われます。

しかし、子クラスの中に追加のフィールドを作り、CButtonクラスの組み込みプロパティを新しい関数で使用したい場合、どのようにすれば正しく行えるのでしょうか?

CButtonクラスでは、クラスメンバm_buttonがprivateセクションで宣言されています。

親クラスのプライベートセクションに入れない。

たぶん、単純明快に、CButtonクラスでグラフィカル・オブジェクトの名前がどのように形成されているかを見て、それらのグラフィカル・オブジェクトを直接操作することができるだろう。ボタンならなおさらで、グラフィックオブジェクトが1つしかないので簡単なはずです。

 
TheXpert:

そう、すでに2人の無関係な人が、あなたのコードの十字架をフォトショップで加工しています )

あなたのコードは正しく動作しません - それはコード自体を見れば明らかです)。

2人?想像の範囲外か?せめてもっとよく読んで、せめてもっとよく写真を見てほしい。最初のメッセージは、デバッガーからのものです。デバッガを使わなくてもコンパイルして動きます。

 
Dmitry Fedoseev:

2人?あなたの妄想から、ですか?もっとよく読むか、せめて写真をよく見るべきだろう。最初のメッセージは、デバッガーからのものです。デバッガを使用しない場合は、コンパイルして動作します。

デバッガ無しでクラッシュするようになった)

デバッガでもクラッシュする ))

スクリプトの出力ログをどこで見るかわからないだけでは?)))

 
TheXpert:

デバッガがないとクラッシュする)

私もデバッガーでクレストしてます(笑)。

スクリプトの出力ログを見る場所がわからないだけでは?)))

いや、知らないよ、どこにあるか教えてよ。

 
Vasiliy Pushkaryov:

別件で一言。CButtonから子クラスCMyButtonを作成すると、ボタンを作成した後、クラスの外でそのプロパティを変更することができます。以下はOnInit()で行われます。

しかし、子クラスの内部に追加のフィールドを作り、CButtonクラスの組み込みプロパティを新しい関数で使用したい場合、どのようにすれば正しく実装できるでしょうか?

CButtonクラスでは、m_buttonクラスのメンバはprivateセクションで宣言されています。

また「尻尾」側から問題を解決しているようですが、私は反対側から解決することをお勧めします。

class CMyButton : public CButton
{ 
  private: 
   CButton        *mybtn;
  public: 
              CMyButton(void){}; 
             ~CMyButton(void){}; 
             
        bool    isPrevState;        // состояние кнопки на предыд.тике, true - была нажата     
        void    setButton();        // создаем кнопку
        void    setProp();          // задаем в ходе программы свойства
}; 

void CMyButton::setButton(void)
{
  mybtn = new CButton;
  mybtn.Create(....................);
  // как в этой функции создать кнопку? Я не могу вызвать метод Create()


ドミトリー・フェドセーエフ

親クラスのプライベートセクションに入ることはできません。

去年、dynamic_castを勉強したら、すごいことができるようになったんだけど、時間がかかるんだよね。


TheXpert です。

デバッガを使わなくてもできました )

checked - I also got: 2019.07.05 17:10:27.307 1 (EURUSD,H1) invalid pointer access in '1.mq5' (43,6)

 

そして、あなたに興味を持ちました。だから、私は本当にあなたが思っているような馬鹿なのかもしれないと思いました。5年前に書いたコードを掘り起こしたので、そのスニペットを紹介します。

だから、あなたはキープできる...吐くんだ好きなだけ...と馬鹿な夢を見るが、今のところ逆である。狂った悪魔のように飛び回っているが、無駄なことだ。

***

そして、私のそのコードは、コンパイルして動くにもかかわらず、すぐに何かが間違っていることが明らかになるのです。オブジェクトはdeleteで削除されない。

しかし、あなたは私がCObj objというものすら知らないと信じたいのでしょう、信じ続けてください...

***

しかし、彼らは「祖父の腹いせに」耳からかかとまで凍らせる覚悟でいるのだ。ゴミ収集機もMQLで登場した。

 
Dmitry Fedoseev:

でも、あなたに興味を持ったので、もしかしたら私は本当にあなたが思っているようなバカなのかもしれないと思いました。5年前に書いたコードを掘り起こしたので、そのスニペットを紹介します。

だから、あなたはキープできる...吐くんだ好きなだけ...そして、私がバカだとパイプを出すが、今のところ逆である。

ここにあるのはポインタの参照で、大騒ぎになっているのは、存在しないオブジェクトへの参照です。コードをよく見てください。
 
Vladimir Simakov:
ここではすべてが正しく、ポインターは参照されています。一方、この戦いの原因となったのは、存在しないオブジェクトへの参照です。コードによく目を通してください。

ある場所には*が、別の場所には*&があることに気付けないとでも思っているのだろうか。

また、私がCObj obj; が何であるかを知らないとでも思っているのでしょうか?

 
Vladimir Simakov:
...存在しないオブジェクトへの参照...

でも、コンパイルして動くんです。

 
Dmitry Fedoseev:

ある場所には*が、別の場所には*&があることに気付けないとでも思っているのだろうか。

また、私がCObj obj; が何であるかを知らないとでも思っているのでしょうか?

そうだったんですね。
void z(CObj & o){
   o = new CObj();
}