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

 
TheXpert:

もモデレーターに預けています。

誰が親権について言ったのか...が、2つのエキセントリックを持つキャラクター...。

 
TheXpert:

また、モデレーターの指導のもとに

自分の投稿を削除したつもりだったのですが。
 
Vladimir Simakov:
自分の投稿を削除してしまったようです。

これは、関数内でnewによりオブジェクトを生成する場合の話である。元々は、既存のオブジェクトへのポインタを渡すという話でした。そして、ここでは、このように渡すことができます。

void f(CObj * obj){}。

 
Dmitry Fedoseev:

また、関数内でオブジェクトを作成するためにポインタを渡す必要がある場合、そのように動作します。

class CObj{
   public:
   int f(){
      return(33);
   }
};

CObj * obj;

void OnStart(){
  z(obj);
  delete(obj);
}

void z(CObj & o){
   o = new CObj();
}
以上、OOPについて知りたかったけど、怖くて聞けなかったことでした)))

このコードは私のために端末をキックアウトしてくれます。せいぜいデバッグ時に重大なエラーが 発生する程度です(アニメーションは画像をクリックしてください)。


このような構成がコンパイラにスキップされるのは不思議なことです。

 
みんな、特に同じ土俵で争うのはやめようぜ。
ドミトリーは最初の例をエラーで出したが、それの何がいけないのか?
Dim、はい、エラーなくコンパイルされますが、スクリプトを実行するとエラーが表示されます。

Vladimirがそれを修正し、ポインターを追加したところ、コードは正しく動作しました。
他に必要なものは?さて、誰が一番カッコイイか探さなきゃね( ´ ▽ ` )ノ)
みんな、お互いを尊重し、傲慢な態度で人格や侮辱に頼らないでください。

Dimitriの初期例
class CObj{
   public:
   int f(){
      return(33);
   }
};

CObj * obj;


void OnStart(){
  z(obj);
  delete(obj);
}

void z(CObj & o){     //тут пропущен указатель
   o = new CObj();
}
ウラジミールによる訂正です。
void z(CObj* &o){    //добавлен указатель
   o = new CObj();
}
検証のため、メソッド結果をプリントアウトした私の修正箇所
この例で動作するようになりました。これ以上何が必要でしょうか?
誰がかっこいいかとか考えるのはやめてくれ、誰にでも誤字・脱字はある。
class CObj
{
   public:
   int f(){return(33);}
};

void z(CObj* &o)
{
   o = new CObj();
   Print(o.f());
}

CObj * obj;

//+------------------------------------------------------------------+
void OnStart()
{      
  z(obj);
  delete(obj);
}
この議論の過程で、コンパイラのエラーが確認されたようです。
なぜコンパイラは、Dmitriの最初の例のコンパイルをエラーなしでスキップするのでしょうか?
 
Vasiliy Sokolov:

このコードは私のために端末をキックアウトしてくれます。せいぜい、致命的な デバッグエラーが発生する程度です。

このような構成がコンパイラから渡されるのは不思議なことです。

ここでは、すべてがコンパイラに有効です。

プログラムデータセグメント内のオブジェクトへのポインタが作成され、コンパイル時に0x0が開始されます。

プロセッサへの必要なコマンドはコードセグメントで作成されます。

実行時には、z(...)関数のアドレスのスタック上にコマンドが発生します。

そして、そこに移動rdx [0x0] 。

また、NULLメモリアドレスへのアクセスは禁止されています。ヌルポインタのデリファレンスは、以下のように呼ばれます。

 
Vladimir Simakov:
ここでは、すべてがコンパイラに有効です。

どのコンパイラー用ですか?

 
Vasiliy Sokolov:

このコードは私のために端末をキックアウトしてくれます。せいぜいデバッグ時に重大なエラーが 発生する程度です(アニメーションは画像をクリックしてください)。


このような構成がコンパイラにスキップされるのは不思議なことです。

私のはコンパイルして正しく動作しますが、完了時にメモリリーク(削除が効かない)のメッセージが表示されます。

 
Igor Makanu:

悪いことは今教えるから、良いことを教えてあげないとね )))

#define private protected

fxsaberのコードに座ったのは無駄じゃなかったんですね。私には名作としか思えません。

 

誤報をお詫びします。先ほど、子クラスでCreate()メソッドを呼び出すことはできないと書きました。

今、再確認したところ、できます。しかし、プライベートメンバーm_buttonへのアクセスは不可能でした。つまり、例えばボタンの状態(押された/離された)を確認することは不可能でした。

イゴールさんのヒントで可能になりました。

#define private protected
#include <Controls\Button.mqh>

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

void CMyButton::setButton(void)
{
  // метод Create() вызывается
   Create(0, "setBtn", 0, 50, 300, 150, 325);
   Text("setBtn");
   
   m_button.State();     // работает когда включаем #define private protected
}