Domande su OOP in MQL5 - pagina 81

 

Un'altra domanda sul casting

c'è questo codice:

struct SHash
   {
      ulong hash[2];
      SHash()                                {  }
      SHash(const double)                    { ArrayInitialize(hash, 0xAAAAAAAAAAAAAAAA);                }
      SHash(const SHash &val)                { ArrayCopy(hash, val.hash);                                }
      bool operator==(const SHash &val)const { return(hash[0] == val.hash[0] && hash[1] == val.hash[1]); }
   };
//+------------------------------------------------------------------+
class BASE
{
private:
   const SHash _hash;
protected:
   BASE(SHash &hash): _hash(hash)             {  }
};

class A:BASE
{
public:
   A(SHash &hash):BASE(hash)                 {  }
};


class B:BASE
{
public:
   B():BASE((SHash)0.0)                      {  }
};

//+------------------------------------------------------------------+
void OnStart()
{
   SHash h(0.0);
   A a(h);
}
//+------------------------------------------------------------------+

e voglio inizializzare la classe B con un costruttore senza parametri, ma non posso lanciare la struttura SHash al costruttore SHash(const double)

Cioè ho bisogno di qualche fusione (SHash) doppio

Nel mio esempio, c'è un errore del compilatore: '(SHash)' - operazione di fusione non valida


se lo scrivi in questo modo:

class B:BASE
{
public:
   B():BASE(0.0)                      {  }
};
errore: '0.0' - parametro passato come riferimento, variabile attesa

 
Igor Makanu:

Un'altra domanda sul casting

c'è questo codice:

e voglio inizializzare la classe B con un costruttore senza parametri, ma non posso lanciare la struttura SHash al costruttore SHash(const double)

cioè ho bisogno di qualche fusione (SHash) doppio

Nel mio esempio, c'è un errore del compilatore: '(SHash)' - operazione di fusione non valida


se lo scrivi in questo modo:

errore: '0.0' - parametro passato come riferimento, variabile attesa

class B:BASE
{
public:
   B():BASE(SHash())                      {  }
};
 
Vladimir Simakov:

funziona così

ma c'è bisogno dell'inizializzazione 0xAAAAAAAAAAAAAAAA per la struttura SHash - è una specie di NULL - non ottiene l'hash MD5 dalla stringa di test (ho controllato)

Il costruttore SHash() sembra non essere necessario ora, ma sembra essere stato necessario qualche giorno fa ))) Così, all'inizio non c'era, poi ho risolto un errore di compilazione da qualche parte con questo costruttore vuoto, o quando si confrontano le strutture o durante l'inizializzazione... in generale, c'è un'alta probabilità che.... sia necessario anche se sembra essere una buona regola inizializzare tutte le variabili....

in generale, vorrei avere una variante o un ambiguo - no ))))

 
Igor Makanu:

funziona così

ma c'è bisogno dell'inizializzazione 0xAAAAAAAAAAAAAAAA per la struttura SHash - è una specie di NULL - non ottiene l'hash MD5 dalla stringa di test (ho controllato)

Il costruttore SHash() sembra non essere necessario ora, ma sembra essere stato necessario qualche giorno fa ))) Così, all'inizio non c'era, poi ho risolto un errore di compilazione da qualche parte con questo costruttore vuoto, o quando si confrontano le strutture o durante l'inizializzazione... in generale, c'è un'alta probabilità che.... sia necessario anche se sembra essere una buona regola inizializzare tutte le variabili....

in generale, vorrei avere una variante o non ambigua - no )))

SHash(0.0)

ma lo indovini da solo?)))

 
Vladimir Simakov:

ma indovinate voi stessi?))

SHash((double)x)
 
Vladimir Simakov:

e indovinarlo da solo?)))

class B:BASE
{
public:
   B():BASE(SHash(0.0))                      {  }
};

Oh, cavolo, funziona!

Credo di aver provato anche io in questo modo, non so perché non ha funzionato.

Grazie!

male incasinato ((!

 
Alexandr Andreev:

Sì, e dove prendi la x nel costruttore della classe?))

 
Vladimir Simakov:

Sì, e da dove prendete x nel costruttore della classe )?

il punto non è circa x) ma che ci può essere un galleggiante all'estremità ricevente, solo 0,0 non è affidabile neanche

 
Alexandr Andreev:

il punto non è la x) ma che ci può essere un float sul ricevitore oltre al duble, e specificare solo 0,0 è anche inaffidabile

anche se tutto questo è un tale dettaglio... non particolarmente importante

 
Alexandr Andreev:

il punto non riguarda x) ma che ci può essere float sulla ricezione da parte del duble, quindi specificare solo 0,0 è anche inaffidabile.

Non importa cosa inizializzare lì, anche int - qualsiasi numero per chiamare questo costruttore

e ho scelto 0.0 per evitare errori di stampa - qualsiasi cifra, cioè 0.0. è più difficile da scrivere e sbagliare che 123