巴解组织。应用问题 - 页 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:
而如果我们节省了几个时钟周期,是否会带来显著的收益?特别是由于初始化只做了一次,以后仍然要分配数值。
答案不在案情上。就个人而言,这个问题对我很重要,因为我想了解这个技术。每一个时钟周期都很重要。否则就没有问题了。我们知道如何铆接茶壶而不考虑规则。
 
Yedelkin:
这对我个人来说是一个重要的问题,因为我想了解这个技术。

正确的方法,一切都会是这样的。初始化列表是引入参数化构造函数的一个结果。

让我们来研究两个例子。

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;
};
因此,在变体1中,我们有一个Init的调用,在变体2中,我们有两个调用。而且由于 "喜欢 "功能非常重,所以加分项也在那里。
 

TheXpert,非常感谢你!我会研究的。

我从你的话中间接理解到,自动初始化 "字符串动态数组复杂对象"类型的变量与用户初始化同一变量在速度上没有区别。

 
Yedelkin:

我从你的话中隐约理解到,自动初始化一个 "字符串动态数组复杂对象"类型的变量和用户初始化同一个变量在速度上没有区别。

给我看一个例子,这样就不会有混淆了,然后我再回答。