OLP. Problemi di applicazione - pagina 12

 
GreyCardinal:

Tu vuoi (come penso sia ovvio) - ottenere nomi sovrascritti nelle variabili dei nomi di file...

Affinché Init() funzioni correttamente, deve essere chiamato dopo la costruzione dell'oggetto.

O no?

Penso che il VMT sia inizializzato solo nel codice di terminazione del costruttore, quindi quando chiamate un metodo nel costruttore, chiamerà un metodo di tipo variabile, non di tipo oggetto costruibile.

È qualcosa del genere.

Almeno questo funziona:

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: se ho capito bene, è meglio proibire del tutto la chiamata di funzioni virtuali nei costruttori. A.

O farli funzionare correttamente. Cosa di cui dubito.

 

Sto imparando a conoscere i costruttori parametrici. Ma sembra che nell'esempio

//+------------------------------------------------------------------+
//| класс для хранения фамилии и имени персонажа                     |
//+------------------------------------------------------------------+
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);};
  };
Le parentesi nella riga evidenziata sono posizionate in modo errato.
 
Yedelkin:

Sto imparando a conoscere i costruttori parametrici. Ma sembra che nell'esempio

nella linea evidenziata ha le parentesi sbagliate.
Grazie, lo correggeremo.
 

Post tecnico (inizio di una piccola discussione sull'inizializzazione, anche nei costruttori). Spostato, così non si perde sotto i passi pesanti dei nuovi arrivati: https://www.mql5.com/ru/forum/58/page31#comment_66890

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

Una domanda sull'inizializzazione. Come regola generale, l'inizializzazione delle variabili stringa e degli oggetti complessi è fatta automaticamente, "per difetto". Questo spreca una certa quantità di potenza di calcolo del computer (lo chiamo "orologio del computer", scusate i termini amatoriali).

Ora ci sono liste di inizializzazione che permettono di inizializzare le variabili con valori personalizzati. C'è qualche differenza nella velocità di inizializzazione tra l'inizializzazione automatica e l'inizializzazione con un valore personalizzato? In altre parole, il numero di "colpi di computer" quando si usano liste di inizializzazione (e valori personalizzati) aumenta rispetto all'inizializzazione automatica?

 
Yedelkin: In altre parole, l'utilizzo di liste di inizializzazione (e valori personalizzati) aumenta il numero di "cicli del computer" rispetto all'inizializzazione automatica?
E se si risparmia qualche ciclo di clock, questo darebbe un guadagno significativo? Soprattutto perché l'inizializzazione viene fatta solo una volta, e i valori dovranno ancora essere assegnati in seguito.
 
Valmars:
E se risparmiamo qualche ciclo di clock, ci sarà un guadagno significativo? Soprattutto perché l'inizializzazione viene fatta una volta sola, e i valori dovranno ancora essere assegnati in seguito.
La risposta non è nel merito. Personalmente, la domanda è importante per me, perché voglio capire la tecnica. Ogni singolo ciclo di clock è importante. Altrimenti non ci sarebbe alcuna domanda. Sappiamo come rivettare le teiere, senza badare alle regole.
 
Yedelkin:
Questa è una domanda importante per me personalmente, perché voglio capire la tecnica.

Con il giusto approccio, tutto sarebbe così. Le liste di inizializzazione sono una conseguenza dell'introduzione dei costruttori parametrici.

Esaminiamo due esempi:

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

È tutto scritto nei commenti.

Esempio 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;
};
Così, nella variante 1 abbiamo 1 chiamata di Init e nella variante 2 abbiamo 2 chiamate. E poiché la funzione "mi piace" è molto pesante, il plus è lì.
 

TheXpert, grazie mille! Ci darò un'occhiata.

Ho capito indirettamente dalle tue parole, che non c'è differenza di velocità tra l'auto-inizializzazione di una variabile di tipo " stringa, array dinamico e oggetto complesso" e l'inizializzazione utente della stessa variabile.

 
Yedelkin:

Ho capito implicitamente dalle tue parole che non c'è differenza di velocità tra l'inizializzazione automatica di una variabile di tipo " stringa, array dinamico e oggetto complesso" e l'inizializzazione della stessa variabile da parte dell'utente.

Mostrami un esempio, in modo che non ci sia confusione, poi ti risponderò.