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

 
Pavel Verveyko:
publicクラスのセクションで静的配列を 宣言し、コンストラクタでそれを初期化することは可能ですか?(以下同様) (あるいは要素ごとのみ?)

よろしい

それとも、結局のところ、静的な配列の初期 化を求めているのでしょうか?

class A
{
public:
   static bool Mass[5];
               A() { ArrayPrint(Mass); }
};

static bool A::Mass[5] = { false, true, false, true, true };
//+------------------------------------------------------------------+
void OnStart()
{
   A a;
}
//+------------------------------------------------------------------+
 
Pavel Verveyko:
静的配列を public class セクションで宣言し、コンストラクタで初期化することは可能ですか?(以下同様) (あるいは要素ごとのみ?)

こんな感じです。

class A{
   protected:
      static int x[];
      int my[];
   public:
      A(){
         ArrayCopy(my,x);
      }   
};

int A::x[]={1,2,3,4,5};

A a;
一般に、OOPの素晴らしさの背景には、このような貧しさがあることが印象的です。なぜ、変数や配列を宣言するときに、通常通り初期化できないのでしょうか?これから理論家たちが、私がバカであることを証明する理論をたくさん動かしてくれることは間違いないのですが、それにしても......。
 
Sergey Dzyublik:

ローカル配列を初期化し、適切な配列フィールドにArrayCopyを実行することができます。

これも思いついたのですが、どのクラスの外でも同様にグローバルスコープに配置することができます。
さらに簡単なのですが、OOPにして欲しかったのです))

 
Dmitry Fedoseev:

こんな感じです。

一般に、OOPの素晴らしさの背景には、このような貧しさがあることが印象的です。なぜ変数や配列を宣言するときに、通常通り初期化できない のでしょうか?もちろん、理論家は私がバカであることを証明するために、いろいろな理論を考え出すだろうが、それにしても......。

私もOOPで 書くたびに全く同じ考え))をしています。

 
Pavel Verveyko:

これも思いつきで、どのクラスの外でもグローバルスコープに配置できるようにしました。
さらに簡単なのですが、OOPにして欲しかったのです))

class CTest{
public:
   int a[4];
   CTest(){
      static int _a[]={1,2,3,4};
      ArrayCopy(a,_a);
   }
};
 
Igor Makanu:

よろしい

それとも、結局のところ、静的な配列の初期 化を求めているのでしょうか?



は、「コンストラクタを持つメソッド」を呼んでいるのでしょうか?

 
Pavel Verveyko:



これは「コンストラクタ付きメソッド」呼び出しでしょうか?

ノー

というのが静的な初期化の方法です。

の場合は、初期化する必要はありません。

class A
{
public:
   static bool Mass[5];
               A() { ArrayPrint(Mass); }
};

static bool A::Mass[5];
//+------------------------------------------------------------------+
void OnStart()
{
   A a;
}
//+------------------------------------------------------------------+

はメソッド呼び出しではなく、クラスA::Mass[5]のフィールドのフルネームです。

しかし、この行を削除 すると、コンパイラ・エラーが発生します - スタティックは、クラスのインスタンスが作成される前にメモリを確保する必要があります - これが、黄色の行が行うことです。
 
Igor Makanu:

ノー

静止画の初期化はこのように記述します。

の場合は初期化する必要はなく、このようなコードになります。

ありがとうございます。この行(static bool A::Mass[5]; )は、どうやってもコンストラクタに転送できないことが判明しましたか?

 
Pavel Verveyko:

それとも、このような場合、静止画を初期化する唯一の方法なのでしょうか?

補記

はい、静力学は別に記述されるべきです。@fxsaber がそれを理解するのを助けてくれました。https://www.mql5.com/ru/forum/325418/page4#comment_16116740

MQL5でも静的クラスを初期化することができます。


パヴェル・ヴェルヴェイコ

つまり、この行(static bool A::Mass[5]; )は、コンストラクタに転送できないのでしょうか?

クラスインスタンスの生成時ではなく、事前にメモリを確保する必要があります。

を、さらに通常の配列として使用することになります。

もし質問が一つの文字列の形での初期化についてなら、Sergeiのバージョンがあなたが求めているものであり、静的なものは必要ないだけです。

 
Igor Makanu:

補記

はい、静力学は別に記述されるべきです。@fxsaber がそれを理解するのを助けてくれました。https://www.mql5.com/ru/forum/325418/page4#comment_16116740

を使えば、MQLでも静的クラスを初期化することができます。

ありがとうございます。今、試してみて、その方法で配列にアクセスすることが可能であることに気がつきました。

int OnInit()
{
   ArrayPrint(A::Mass);

   return(INIT_SUCCEEDED);
}

正直、OOPはあるのですが、Helpでは見たことがありません。 そういうニュアンスが書かれていないのが残念です。

回答してくださった皆さん、どうもありがとうござい ました!

理由: