PLOです。アプリケーションの問題

 

OOPの 話題は、「良い、悪い」の意見交換の場と化しています。もっと地に足のついた質問に答えてほしい。

問題はこれです。C++の教科書で、あるクラスのインスタンスを、異なる2つの親クラスの子孫に同時にすることができる、という記述を目にしたことがあります。

class A
{...}
class B
{...}
class C : public A : public B
{...}

あるいは似たようなもの(出典が見つからない)。MQL5ではどのような状況ですか?異なる2つの親クラスの子孫であることを宣言することは可能ですか?構文は?

ヘルプのフレーズ「多重継承禁止」は、この状況についてではないでしょうか?

 
Yedelkin:

OOPの 話題は、「良い、悪い」の意見交換の場と化しています。もっと地に足のついた質問に答えてほしい。

問題はこれです。C++の教科書で、あるクラスのインスタンスを、異なる2つの親クラスの子孫に同時にすることができる、という記述を目にしたことがあります。

あるいは似たようなもの(出典が見つからない)。MQL5ではどのような状況ですか?異なる2つの親クラスの子孫であることを宣言することは可能ですか?構文は?

ヘルプのフレーズ「多重継承禁止」は、この状況についてではないでしょうか?

MQL5では多重継承はサポートされていませんが、オブジェクトポインタの受け渡しに面白い仕組みがあり、それを使ってこのような実装が可能です。

 

OOPを使えば、コードの構造化はとても簡単です(くだらないことを失礼しました)。1つ1つ方法をとって、スタンプを押していくのです。とても効果的でわかりやすいですね。しかし、この複数のラッパーはプロセッサのコード処理速度に影響を与えないのだろうか、という疑問が湧いてくる。具体的には、この2つのコード片の間で実行速度に差はあるのでしょうか?

double ddd=0.0;                   //первый вариант кода, инициализация без применения функций/методов
 

double ddd;                       //второй вариант кода, инициализация с применением функций/методов
void function(double a) { a=0.0; }
...
function(ddd);

それとも、コンパイルの段階で人間語から機械語に変換して、コンピュータの処理速度に全く差が出ないようにしているのでしょうか?

 
Urain:

MQL5では、多重継承はサポートされていません ...

では、「多重継承」とは、両親が複数いることなのでしょうか?

 
Yedelkin:
では、「複数相続」は複数育児ですか?

はい正確にクラスは1つの親を持つことができ、カスケードができますが、2つの親とmql5ができません。

原理的には、継承の代わりに、クラス自身の中で「親としての型」クラスを呼び出し、そのポインタを介して「親としての型」データにアクセスすることができます。

 
Urain:
はい正確にクラスは1つの親を持つことができ、カスケードができますが、2つの親とmql5ができません。
OK、了解です。すぐには意味を調べようとは思いませんでした。
 
Yedelkin:

このコードは、多重継承とほとんど変わりません。

class C_A
  {
public:
                     C_A(void){};
                    ~C_A(void){};
   double            a;
  };
//+------------------------------------------------------------------+
class C_B
  {
public:
                     C_B(void){};
                    ~C_B(void){};
   double            b;
  };
//+------------------------------------------------------------------+
class C_C
  {
public:
   C_A              *ua;
   C_B              *ub;
                     C_C(void){ua=new C_A();ub=new C_B();};
                    ~C_C(void){delete ua;delete ub;};
  };
//+------------------------------------------------------------------+
実際、C_Cクラスは適切なポインタを介してC_A、C_Bデータにアクセスできる。
 
Urain:

このコードは、多重継承とほとんど変わりません。

実際、クラスC_Cは、対応するポインタを通じてC_A、C_Bのデータにアクセスできる。

カッコイイ!コンストラクタで外部クラスのインスタンスを生成することは思いつきませんでした。ありがとうございました。

追記そして、このセリフの中に

C_C(void){ua=new C_A();ub=new C_B();};

C_A クラスの C_A() コンストラクタにnew 演算子を適用しています。

リファレンスブックで、new 演算子のオペランドはコンストラクタではなく、クラスそのものであることを理解しました。ここにどんな特殊性があるのでしょうか。

 
ちなみに、しばらくすると、デザイナーはパラメータが動くようになり、開発者はかなり楽になります。
 
Renat:
ところで、しばらくすると、デザイナーはパラメータを使えるようになり、開発者はずいぶん楽になります。
はい、覚えていますよ :)
 
Yedelkin:

カッコイイ!コンストラクタで外部クラスのインスタンスを生成することは思いつきませんでした。ありがとうございました。

追記そして、このセリフの中に

C_A クラスの C_A() コンストラクタにnew 演算子を適用しています。

リファレンスブックで、new 演算子のオペランドはコンストラクタではなく、クラスそのものであることを理解しました。ここにどんな特殊性があるのでしょうか。

new演算 子はクラスのインスタンスを生成し、それに伴ってコンストラクタが呼び出されます。構文に書かれているので、それ以外では呼び出すことができません。

静的宣言では、すべてが自動的に行われます。

ちなみに、これも動作して自動的に破棄されます

class C_C
  {
public:
   C_A               ua;
   C_B               ub;
                     C_C(void){};
                    ~C_C(void){};
  };
//+------------------------------------------------------------------+
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5
理由: