OLP. Problèmes d'application - page 12

 
GreyCardinal:

Vous voulez (comme je pense que c'est évident) - obtenir des noms surchargés dans les variables de nom de fichier...

Pour que Init() fonctionne correctement, il doit être appelé après la construction de l'objet.

Ou pas ?

Je pense que le VMT n'est initialisé que dans le code de terminaison du constructeur, donc lorsque vous appelez une méthode dans le constructeur, il appellera une méthode de type variable, et non de type objet constructible.

C'est quelque chose comme ça.

Au moins, celui-ci fonctionne :

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

Pour MetaQuotes: Si j'ai bien compris, il est préférable d'interdire complètement l'appel aux fonctions virtuelles dans les constructeurs. A.

Ou les faire fonctionner correctement. Ce dont je doute.

 

Je commence juste à connaître les constructeurs paramétriques. Mais il semble que dans l'exemple

//+------------------------------------------------------------------+
//| класс для хранения фамилии и имени персонажа                     |
//+------------------------------------------------------------------+
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);};
  };
Les parenthèses dans la ligne surlignée sont mal placées.
 
Yedelkin:

Je commence juste à connaître les constructeurs paramétriques. Mais il semble que dans l'exemple

dans la ligne surlignée a les mauvaises parenthèses.
Merci, nous allons le corriger.
 

Poste technique (début d'une petite discussion sur l'initialisation, également dans les constructeurs). Déplacé, pour qu'il ne se perde pas sous les pas lourds des nouveaux arrivants : https://www.mql5.com/ru/forum/58/page31#comment_66890

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

Une question sur l'initialisation. En règle générale, l'initialisation des variables de type chaîne et des objets complexes se fait automatiquement, "par défaut". Cela gaspille une certaine quantité de puissance de calcul de l'ordinateur (je l'appelle "horloge de l'ordinateur", désolé pour les termes amateurs).

Il existe désormais des listes d'initialisation qui vous permettent d'initialiser des variables avec des valeurs personnalisées. Y a-t-il une différence dans la vitesse d'initialisation entre l'initialisation automatique et l'initialisation avec une valeur personnalisée ? En d'autres termes, le nombre de "coups d'ordinateur" lors de l'utilisation de listes d'initialisation (et de valeurs personnalisées) augmente-t-il par rapport à l'initialisation automatique ?

 
Yedelkin: En d'autres termes, l'utilisation de listes d'initialisation (et de valeurs personnalisées) augmente-t-elle le nombre de "cycles informatiques" par rapport à l'initialisation automatique ?
Et si quelques cycles d'horloge sont économisés, cela donne-t-il un gain significatif ? D'autant plus que l'initialisation ne se fait qu'une fois, et que les valeurs devront encore être attribuées plus tard.
 
Valmars:
Et si nous gagnons quelques cycles d'horloge, cela donnera-t-il un gain significatif ? D'autant plus que l'initialisation est faite une fois, et que les valeurs devront encore être assignées plus tard.
La réponse n'est pas sur le fond. Personnellement, la question est importante pour moi, car je veux comprendre la technique. Chaque cycle d'horloge est important. Sinon, il n'y aurait pas de question. Nous savons comment riveter des théières sans tenir compte des règles.
 
Yedelkin:
C'est une question importante pour moi personnellement, car je veux comprendre la technique.

Avec la bonne approche, tout serait comme ça. Les listes d'initialisation sont une conséquence de l'introduction des constructeurs paramétriques.

Examinons deux exemples :

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

Tout est écrit dans les commentaires.

Exemple 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;
};
Ainsi, dans la variante 1, nous avons 1 appel d'Init et dans la variante 2, nous avons 2 appels. Et comme la fonction "like" est très lourde, le plus est là.
 

TheXpert, merci beaucoup ! Je vais m'en occuper.

J'ai compris indirectement de vos propos, qu'il n'y a pas de différence de vitesse entre l'auto-initialisation d'une variable de type " string, dynamic array et complex object" et l'initialisation par l'utilisateur de la même variable.

 
Yedelkin:

J'ai implicitement compris de vos propos qu'il n'y a pas de différence de vitesse entre l'auto-initialisation d'une variable de type " string, dynamic array et complex object" et l'initialisation par l'utilisateur de la même variable.

Montrez-moi un exemple, afin qu'il n'y ait pas de confusion, puis je répondrai.