OLP. Questões de aplicação - página 12

 
GreyCardinal:

Quer (como eu penso ser óbvio) - obter nomes sobrepostos em variáveis de nome de ficheiro...

Para que o Init() funcione correctamente, deve ser chamado após a construção do objecto.

Ou não?

Penso que o VMT só é rubricado no código de terminação do construtor, por isso quando se chama um método no construtor, ele chamará um método de tipo variável, não de tipo objecto construtível.

É algo parecido com isto.

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

Para MetaQuotes: Se eu acertei, é melhor proibir completamente a chamada de funções virtuais em construtores. Para.

Ou fazê-los funcionar correctamente. O que eu duvido.

 

Apenas para conhecer os construtores paramétricos. Mas parece que no exemplo

//+------------------------------------------------------------------+
//| класс для хранения фамилии и имени персонажа                     |
//+------------------------------------------------------------------+
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);};
  };
Os parênteses na linha realçada estão colocados incorrectamente.
 
Yedelkin:

Apenas para conhecer os construtores paramétricos. Mas parece que no exemplo

na linha realçada tem os parênteses errados.
Obrigado, vamos corrigi-lo.
 

Posto técnico (início de uma pequena discussão sobre a inicialização, também em construtores). Movido, para não se perder sob as pesadas pegadas dos recém-chegados: https://www.mql5.com/ru/forum/58/page31#comment_66890

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

Uma pergunta sobre a inicialização. Como regra geral, a inicialização de variáveis de cadeia e objectos complexos é feita automaticamente, "por defeito". Isto desperdiça uma certa quantidade de poder informático do computador (chamo-lhe "relógio de computador", desculpem os termos amadores).

Agora existem listas de inicialização que lhe permitem rubricar variáveis com valores personalizados. Existe alguma diferença na velocidade de inicialização entre a inicialização automática e a inicialização com um valor personalizado? Por outras palavras, o número de "traços de computador" ao utilizar listas de inicialização (e valores personalizados) aumenta em comparação com a inicialização automática?

 
Yedelkin: Por outras palavras, a utilização de listas de inicialização (e valores personalizados) aumenta o número de "ciclos informáticos" em comparação com a inicialização automática?
E se alguns ciclos de relógio forem poupados, será que isso dá um ganho significativo? Especialmente porque a inicialização é feita apenas uma vez, e os valores ainda terão de ser atribuídos mais tarde.
 
Valmars:
E se pouparmos alguns ciclos de relógio, será que isso dará um ganho significativo? Especialmente porque a inicialização é feita uma vez, e os valores terão ainda de ser atribuídos mais tarde.
A resposta não é sobre os méritos. Pessoalmente, a questão é importante para mim, porque quero compreender a técnica. Cada ciclo de relógio é importante. Caso contrário, não haveria dúvidas. Sabemos como rebitar bules sem ter em conta as regras.
 
Yedelkin:
Esta é uma questão importante para mim pessoalmente, porque quero compreender a técnica.

A abordagem certa, tudo seria assim. As listas de iniciação são uma consequência da introdução de construtores paramétricos.

Vamos examinar dois exemplos:

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

Está tudo escrito nos comentários.

Exemplo 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;
};
Assim, na variante 1 temos 1 chamada do Init e na variante 2 temos 2 chamadas. E como a função "gosto" é muito pesada, a vantagem está lá.
 

TheXpert, muito obrigado! Vou analisar a questão.

Compreendi indirectamente das suas palavras, que não há diferença na velocidade entre a auto-inicialização da variável do tipo " string, matriz dinâmica e objecto complexo" e a inicialização do utilizador da mesma variável.

 
Yedelkin:

Das vossas palavras entendi indirectamente que não há diferença na velocidade entre a auto-inicialização da variável do tipo " string, matriz dinâmica e objecto complexo" e a inicialização pelo utilizador da mesma variável.

Mostre-me um exemplo, para que não haja confusão, então eu responderei.