PLOです。アプリケーションの問題 - ページ 12

 
GreyCardinal:

ファイル名変数で上書きされた名前を取得したいのですね。

Init()が正しく動作するためには、オブジェクトを構築した後に 呼び出す必要があります。

それとも違う?

VMTはコンストラクタの終端コードでしか初期化されないので、コンストラクタでメソッドを呼び出すと、コンストラクタブルオブジェクト型ではなく、変数型のメソッドが呼び出されるのだと思います。

それは、こんな感じです。

少なくともこれは使える。

void OnStart()
  {
   CO2=new CCO2;
   CO2.Init();
   Print(CO2.Name()," filename=",CO2.filename);
   delete CO2;
   
   H2O=new CH2O;
   H2O.Init();
   Print(H2O.Name()," filename=",H2O.filename);
   delete H2O;
  }

MetaQuotes: もし私が正しいのであれば、コンストラクタで仮想関数を 呼び出すことを完全に禁止した方が良いと思います。へ。

あるいは正しく動作させる。それはどうでしょう。

 

パラメトリックコンストラクタを知るところから。しかし、どうやら例の

//+------------------------------------------------------------------+
//| класс для хранения фамилии и имени персонажа                     |
//+------------------------------------------------------------------+
class CPerson
  {
   string            m_first_name;     // имя 
   string            m_second_name;    // фамилия
public:
   //--- пустой конструктор по умолчанию
                     CPerson() {Print(__FUNCTION__);};
   //--- параметрический конструктор
                     CPerson(string full_name);
   //--- конструктор со списком инициализации
                     CPerson(string surname,string name): m_second_name(surname, m_first_name(name)) {};
   void PrintName(){PrintFormat("Name=%s Surname=%s",m_first_name,m_second_name);};
  };
ハイライトされた行の括弧の位置が正しくありません。
 
Yedelkin:

パラメトリックコンストラクタを知るところから。しかし、どうやら例の

は、括弧が正しくありません。
ありがとうございます、訂正させていただきます。
 

技術的な投稿(コンストラクタの初期化に関する小さな議論の始まり)。移動しました。新人の重い足音で迷子にならないように、https://www.mql5.com/ru/forum/58/page31#comment_66890

Изучаем и пишем вместе на MQL5
Изучаем и пишем вместе на MQL5
  • www.mql5.com
2) вывод всей возможной информации по инструментам, ордерам и др.
 

初期化について質問です。原則として、文字列変数や 複雑なオブジェクトの初期 化は、「デフォルト」で自動的に行われます。そのため、コンピュータの演算能力(私は「コンピュータクロック」と呼んでいます、素人考えですみません)を一定量浪費しています。

現在は初期化リストがあり、カスタム値で変数を初期化することができます。自動初期化とカスタム値による初期化では、初期化速度に差はありますか?つまり、初期化リスト(およびカスタム値)を使用した場合、自動初期化と比べて「コンピュータのストローク数」が増えるのでしょうか?

 
Yedelkin: つまり、初期化リスト(およびカスタム値)を使用すると、自動初期化と比べて「コンピュータのサイクル数」が増えるのでしょうか?
また、もし数クロックサイクルが節約できたとしても、それは大きな利益をもたらすのでしょうか?特に、初期化は一度だけ行われ、値は後で割り当てる必要があるためです。
 
Valmars:
また、数クロックサイクルを節約できたとして、大きな利得が得られるのでしょうか?特に、初期化は一度だけで、値は後から代入する必要がありますから。
答えは、メリットではありません。個人的には、テクニックを理解したいので、この質問は重要です。1クロック1サイクルが重要なのです。そうでなければ、何の疑問も抱かない。私たちは、ルールを気にせずティーポットのリベット打ちをする方法を知っています。
 
Yedelkin:
個人的には、この技術を理解したいので、重要な質問です。

正しいアプローチで、すべてがそのようになる。初期化リストは、パラメトリックコンストラクタの導入に伴うものです。

2つの例を見てみましょう。

class A
{
private:
   // конструктор по умолчанию недоступен
   A(){}
public:
   A(const double& value)
      : m_Value(value)
   {}
private:
   double m_Value;
}

class B
{
public:
   B()
   // т.к. коструктор А не имеет конструктора по умолчанию, единственный способ
   // использования класса -- инициализация в списке инициализации.
   // по-другому просто не должно скомпилиться
      : A(0)
   {
   }

private:
   A m_Value;
}

全てはコメントに書かれています。

例2.

class A
{
public:
   A()
   {
      Init(0);
   }
   
   A(const double& value)
   {
      Init(value);
   }
   
   void Init(double value)
   {
      // очень тяжелая функция
   }
};

class B
{
public:
   // вариант1, правильный
   B(const double& value)
      : m_Value(value)
   {
   }

/*
   // вариант2, неправильный
   B(const double& value)
   {
      m_Value.Init(value);
   }
*/

private:
   A m_Value;
};
つまり、variant 1ではInitの呼び出しが1回、variant 2では呼び出しが2回ということになります。また、「いいね!」機能は非常に重いので、アップは当然です。
 

TheXpert さん、ありがとうございました。調べてみるよ。

文字列動的配列複合オブジェクト」型の変数の自動初期化と、同じ変数のユーザーによる初期化とは、速度に差がないことが、お言葉から間接的に理解できました。

 
Yedelkin:

文字列動的配列複合オブジェクト」型の変数の自動初期化とユーザーによる同じ変数の初期化との間に速度差がないことは、お言葉から暗黙のうちに理解しました。

混乱しないように、例を示してください、そうすれば私は答えます。