OLP. Problemas de aplicación - página 12

 
GreyCardinal:

Quieres (como creo que es obvio) - obtener nombres anulados en las variables de nombre de archivo...

Para que Init() funcione correctamente, debe llamarse después de construir el objeto.

¿O no?

Creo que el VMT sólo se inicializa en el código de terminación del constructor, por lo que cuando se llama a un método en el constructor, se llamará a un método de tipo variable, no de tipo objeto construible.

Es algo así.

Al menos este funciona:

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;
  }

A MetaQuotes: Si lo he entendido bien, es mejor prohibir totalmente la llamada a funciones virtuales en los constructores. Para.

O hacer que funcionen correctamente. Lo cual dudo.

 

Sólo estoy conociendo los constructores paramétricos. Pero parece que en el ejemplo

//+------------------------------------------------------------------+
//| класс для хранения фамилии и имени персонажа                     |
//+------------------------------------------------------------------+
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);};
  };
Los paréntesis en la línea resaltada están mal colocados.
 
Yedelkin:

Sólo estoy conociendo los constructores paramétricos. Pero parece que en el ejemplo

en la línea resaltada tiene los paréntesis equivocados.
Gracias, lo corregiremos.
 

Post técnico (inicio de una pequeña discusión sobre la inicialización, también en los constructores). Movido, para que no se pierda bajo las pesadas pisadas de los recién llegados: https://www.mql5.com/ru/forum/58/page31#comment_66890

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

Una pregunta sobre la inicialización. Como regla general, la inicialización de las variables de cadena y de los objetos complejos se hace automáticamente, "por defecto". Esto hace que se desperdicie una cierta cantidad de potencia de cálculo del ordenador (yo lo llamo "reloj de ordenador", perdón por los términos de aficionado).

Ahora hay listas de inicialización que permiten inicializar las variables con valores personalizados. ¿Hay alguna diferencia en la velocidad de inicialización entre la inicialización automática y la inicialización con un valor personalizado? En otras palabras, ¿aumenta el número de "golpes de ordenador" cuando se utilizan listas de inicialización (y valores personalizados) en comparación con la inicialización automática?

 
Yedelkin: En otras palabras, ¿el uso de listas de inicialización (y valores personalizados) aumenta el número de "ciclos de ordenador" en comparación con la inicialización automática?
Y si ahorramos unos cuantos ciclos de reloj, ¿se obtiene una ganancia significativa? Sobre todo porque la inicialización se hace una sola vez, y los valores tendrán que ser asignados más tarde.
 
Valmars:
Y si ahorramos unos cuantos ciclos de reloj, ¿habrá una ganancia significativa? Sobre todo porque la inicialización se hace una vez, y los valores tendrán que ser asignados más tarde.
La respuesta no está en el fondo. Personalmente, la pregunta es importante para mí, porque quiero entender la técnica. Cada ciclo de reloj es importante. De lo contrario, no habría ninguna pregunta. Sabemos cómo remachar teteras sin tener en cuenta las reglas.
 
Yedelkin:
Esta es una pregunta importante para mí personalmente, porque quiero entender la técnica.

El enfoque correcto, todo sería así. Las listas de inicialización son una consecuencia de la introducción de constructores paramétricos.

Examinemos dos ejemplos:

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;
}

Todo está escrito en los comentarios.

Ejemplo 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;
};
Así, en la variante 1 tenemos 1 llamada de Init y en la variante 2 tenemos 2 llamadas. Y como la función "me gusta" es muy pesada, hay una ventaja.
 

TheXpert, ¡muchas gracias! Lo investigaré.

Entendí indirectamente de sus palabras, que no hay diferencia en la velocidad entre la auto-inicialización de la variable de tipo " cadena, matriz dinámica y objeto complejo" y la inicialización del usuario de la misma variable.

 
Yedelkin:

De tus palabras he entendido implícitamente que no hay diferencia de velocidad entre la autoinicialización de una variable de tipo " cadena, matriz dinámica y objeto complejo" y la inicialización por parte del usuario de la misma variable.

Muéstrame un ejemplo, para que no haya confusión, y luego te responderé.
Razón de la queja: