앗. 지원 질문 - 페이지 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;
  }

To 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에 대한 1개의 호출이 있고 옵션 2에는 2개의 호출이 있습니다. 이후 "type" 기능은 매우 무겁고, 거기에 플러스가 있습니다.
 

엑스퍼트님 , 정말 감사합니다! 나는 이것을 정리할 것이다.

말씀하신대로 " string , dynamic array and complex object " 유형의 변수 자동 초기화와 동일한 변수의 사용자 초기화 사이에 속도 차이가 없다는 것을 간접적으로 이해했습니다.

 
Yedelkin :

말씀하신대로 " string , dynamic array and complex object " 유형의 변수 자동 초기화와 동일한 변수의 사용자 초기화 사이에 속도 차이가 없다는 것을 간접적으로 이해했습니다.

불일치가 없도록 예를 보여 주시면 답변 드리겠습니다.