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

 

もう一つの質問ですが、Wikiの 記事Abstract Classを 紹介します。

C++のサンプルに興味がある

class CA { // Абстрактный класс
  public:
    CA ( void ) { std::cout << "This object of the class "; }

    virtual void Abstr ( void ) = 0; // Чистая (пустая) виртуальная функция.
    void         fun   ( void ) { std::cout << "Реализация не будет наследоваться!"; }

    ~CA () { std::cout << "." << std::endl; } //Вызывается в обр. порядке конструкторов
  };

class CB : public CA {
  public:
    CB ( void ) { std::cout << "CB;"; }

    void Abstr ( void ){ std::cout << " call function cb.Abstr();"; } //Подменяющая функция.
    void fun   ( void ){ std::cout << " call function cb.fun()"; }

    ~CB () {} // Неверно для абстр. кл. ~CB(){ ~CA(); } 
  };

class CC : public CA {
  public:
    CC ( void ) { std::cout << "CC;"; }

    void Abstr ( void) { std::cout << " call function cc.Abstr();"; } //Подменяющая функция.
    void fun   ( void ) { std::cout << " call function cc.fun()"; }

  ~CC () {} // Неверно для абстр. кл. ~CC(){ ~CA(); } 
  };

int main () {
  std::cout << "Program:" << std::endl;
  CB cb;
  cb.Abstr(); cb.fun(); cb.~CB();

  CC cc;
  cc.Abstr(); cc.fun(); cc.~CC();

  return 0;
  }

プログラムの結果です。

プログラム

CBクラスのこのオブジェクトは、関数cb.Abstr()を呼び出し、関数cb.fun()を呼び出します。

CCクラスのこのオブジェクトは、関数cc.Abstr()を呼び出し、関数cc.fun()を呼び出します。

.

.


void fun ( void ) メソッドに興味があります。

- なぜバーチャル仕様がないのか?

- バーチャルを入れたら、後で何が変わるの?


なぜ、何のために、コードはここにあります。

class base
{
public:
   virtual void HighPriorityTask() {}
   virtual void Task() {}
};
//+------------------------------------------------------------------+
class A: public base
{
public:
   virtual void HighPriorityTask() { Print(__FUNCSIG__); }
};
//+------------------------------------------------------------------+
class B: public base
{
public:
   virtual void Task() { Print(__FUNCSIG__); }
};

//+------------------------------------------------------------------+
void OnStart()
{
   base *obj[4];;
   obj[0] = new A; obj[1] = new A;  
   obj[2] = new B; obj[3] = new B; 
   for(int i=ArraySize(obj)-1; i>=0; i--)
   {
      obj[i].HighPriorityTask();
      obj[i].Task();
   }
   
   for(int i=ArraySize(obj)-1; i>=0; i--)
      delete obj[i];

2020.05.28 14:41:20.294 tst (EURUSD,H1) void B::Task()

2020.05.28 14:41:20.298 tst (EURUSD,H1) void B::Task()

2020.05.28 14:41:20.298 tst (EURUSD,H1) void A::HighPriorityTask()

2020.05.28 14:41:20.298 tst (EURUSD,H1) void A::HighPriorityTask()

しかし、私の子孫は1つのメソッドしか必要としないので、宣言と初期化の順序に関係なく、最初に HighPriorityTask() メソッドを持つオブジェクトを呼び出し、次に Task() を呼び出したいのですが、どうすればよいでしょうか?


一網打尽

は、簡単な方法で可能なのでしょうか?

 
Igor Makanu:

そしてもちろん、すべて1つのサイクルで。

は、簡単な手段で可能なのでしょうか?

そして、なぜ1サイクルで行う必要があるのでしょうか?

また、なぜそれが自然なことなのか。

当然、最低でも2回のサイクルがあります。

 
Koldun Zloy:

そして、なぜ同じサイクルで行わなければならないのか?

また、なぜそれが自然なことなのか。

当然、最低でも2回のサイクルがあります。

よし、2サイクルってことは奇跡は起きないのか((

 
Igor Makanu:

OK、2サイクルってことは奇跡は起きないんですね((

ループを完全に排除してみるのもいいかもしれませんね。
ループや再帰を使わずに1から100まで印刷する例もあります。
もしかしたら、これらの例が役に立つかもしれません、もしそれが関係するならば ))

Печать от 1 до 100 на C ++, без цикла и рекурсии | Портал информатики для гиков
  • 2020.01.01
  • espressocode.top
Ниже приводится программа на C ++, которая печатает от 1 до 100 без цикла и без рекурсии. #include using namespace std;    template
 
Roman:
こんなくだらないことに意味があるのだろうか。
 
Igor Makanu:

もう一つの質問ですが、Wikiの 記事Abstract Classを 紹介します。

C++のサンプルに興味がある

プログラムの結果です。

プログラム

CBクラスのこのオブジェクトは、関数cb.Abstr()を呼び出し、関数cb.fun()を呼び出します。

CCクラスのこのオブジェクトは、関数cc.Abstr()を呼び出し、関数cc.fun()を呼び出します。

.

.


void fun ( void ) メソッドに興味があります。

- なぜバーチャル仕様がないのですか?

- バーチャルを入れたら、後で何が変わるの?


なぜ、何のために、コードはここにあります。

2020.05.28 14:41:20.294 tst (EURUSD,H1) void B::Task()

2020.05.28 14:41:20.298 tst (EURUSD,H1) void B::Task()

2020.05.28 14:41:20.298 tst (EURUSD,H1) void A::HighPriorityTask()

2020.05.28 14:41:20.298 tst (EURUSD,H1) void A::HighPriorityTask()

しかし、私の子孫は1つのメソッドしか必要としないので、宣言と初期化の順序に関係なく、最初に HighPriorityTask() メソッドを持つオブジェクトを呼び出し、次に Task() を呼び出したいのですが、これはどうすればよいでしょうか?


一網打尽

は、簡単な方法で可能なのでしょうか?

1.ベースクラスのポインタを宣言して子オブジェクトを作成した場合、ベースクラスのこの同じポインタを介してメソッドを呼び出す場合。

a) 子クラスから仮想メソッドが呼び出される(このために特別に作成された仮想関数テーブルを経由して)。

b)非仮想的な メソッドは、ベースクラスから呼び出される。たとえ、子クラスでオーバーライドされていても。

2.もし、ループを1つにしたいのであれば

a) オブジェクトの配列をタイプ別にソートする。

b) 特定のタスクごとに、そのタスクを解決するオブジェクトへのポインタを別の配列で保持する。つまり、HighPriorityTaskを 呼び出さなければならないすべてのオブジェクトは

は別の配列に格納し、それを最初に呼び出す必要があります。

h.e. 一般に、ソートをしなければ、オブジェクトの半分が最初に実行され、次に残りが実行されるというのは、どのように想像できるでしょうか?:)まあ、ジョブキューを開始するだけならね。

しかし、これは創造的な問題で、1円の問題を解決するために多くの洗練された方法を考え出すことができます))) 主なことは、物理学の法則を侵害しないことで、すべてがうまくいくでしょう)))

 
Aleksey Mavrin:

2.もし、同じループを使うなら

a) オブジェクトの配列をタイプ別にソートする。

b) 特定のタスクのために、そのタスクを実行するオブジェクトへのポインタの配列を別途用意する。つまり、HighPriorityTaskを 呼び出さなければならないすべてのオブジェクトは

は別の配列に格納し、それを最初に呼び出す必要があります。

h.e. 一般に、ソートをしなければ、オブジェクトの半分が最初に実行され、次に残りが実行されるというのは、どのように想像できるでしょうか?:)まあ、ジョブキューを開始するだけならね。

しかし、これは創造的な質問です、あなたはペニータスクを解決するために多くの洗練された方法を考え出すことができます))) 主なものは、物理学の法則を侵害しないことです、そしてすべてがうまくいくでしょう)))

そうではなく、コンパイラが空のメソッドを最適化してくれると思っています。

Aleksey Mavrin:

1.基底クラスのポインタを宣言して子オブジェクトを作成した場合、この基底クラスのポインタそのものを介してメソッドを呼び出すと

a) 子クラスから仮想メソッドが呼び出される(このために特別に作成された仮想関数テーブルを経由して)。

b)非仮想的な メソッドは、ベースクラスから呼び出される。たとえ、子クラスでオーバーライドされていても。

そういえば、json libraryhttps://www.mql5.com/en/code/11134 を修正したんだった(KBよりちょっと新鮮なgithabのどこかにあった)。

というコンパイラの警告が表示されました。

非推奨の動作であり、将来のMQLコンパイラーバージョンでは、hiddenメソッド呼び出しは無効になる予定です。

クラス内のメソッドを指定することで修正

this.JSONValue:: getLong(getValue(index),out);

ありがとうございます、かなり鮮明な画像です

 
Igor Makanu:

コンパイラは空のメソッドを最適化すると思うので、絶対に嫌です。

しかし、空の関数を呼び出しても、いずれにせよあまり食指は動かないだろう。

イゴール・マカヌ

OK、2ループは2ループを意味するので、ミラクルは起きないでしょう((

論理的には2つのループで処理できることを、なぜ1つのループに押し込まなければならないのでしょうか? なぜなら、スピードも、明快さも、シンプルさも得られないし、ハードディスクのサイズはとっくの昔にメガバイトで測られるものではありませんから。

 
Andrei Trukhanovich:

また、ハードディスクの大きさはメガバイト単位ではありません。

まだ使ってもいないのに!?))))

通常のメソッド呼び出しと同様のものを作るための仕様を知るだけでよい

ありがとうございます、よくわかりました。

Andrei Trukhanovich:

バーチャルとは限らない。

私はあなたに例を示すことができれば、質問は、ポリモーフィズムの 偉大な選択のため、いずれかの仮想またはそれなし、または継承または派生クラスでこのメソッドを閉じるが発生しました

 
Roman:

ループを完全に排除してみるのもよいでしょう。
ループや再帰を使わずに1から100まで印刷する例もあります。
もしかしたら、これらの例が役に立つかもしれません、もしそれが関係するならば ))

なぜ?もう一つのパターン。パターン熟練者が認めなかっただけで、明らかに正統派でも正統派でもない。 なぜ再帰性ではないのですか?また、再帰性は、alongではなくacrossである。