Questions sur la POO dans MQL5 - page 81

 

Une autre question sur le casting

il y a ce code :

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);
}
//+------------------------------------------------------------------+

et je veux initialiser la classe B avec un constructeur sans paramètres, mais je ne peux pas caster la structure SHash vers le constructeur SHash(const double)

c'est-à-dire que j'ai besoin d'un double casting (SHash)

Dans mon exemple, il y a une erreur de compilation : '(SHash)' - opération de cast invalide.


si vous l'écrivez de cette façon :

class B:BASE
{
public:
   B():BASE(0.0)                      {  }
};
error : '0.0' - paramètre passé comme référence, variable attendue

 
Igor Makanu:

Une autre question sur le casting

il y a ce code :

et je veux initialiser la classe B avec un constructeur sans paramètres, mais je ne peux pas caster la structure SHash vers le constructeur SHash(const double)

c'est-à-dire que j'ai besoin d'un double casting (SHash)

Dans mon exemple, il y a une erreur de compilation : '(SHash)' - opération de cast invalide.


si vous l'écrivez de cette façon :

error : '0.0' - paramètre passé comme référence, variable attendue

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

cela fonctionne de cette façon

mais j'ai besoin de l'initialisation 0xAAAAAAAAAAAAAA pour la structure SHash - c'est une sorte de NULL - je n'obtiens pas le hash MD5 de la chaîne de test (j'ai vérifié)

Le constructeur SHash() semble ne pas être nécessaire maintenant, mais semble avoir été nécessaire il y a quelques jours ;))) Donc, au début, il n'était pas là, puis j'ai corrigé une erreur de compilation quelque part avec ce constructeur vide, ou lors de la comparaison de structures ou pendant l'initialisation... en général, il y a une forte probabilité que.... soit nécessaire bien qu'il semble être une bonne règle d'initialiser toutes les variables....

en général, j'aurais aimé avoir une variante ou sans ambiguïté - non ))))

 
Igor Makanu:

cela fonctionne de cette façon

mais j'ai besoin de l'initialisation 0xAAAAAAAAAAAAAA pour la structure SHash - c'est une sorte de NULL - je n'obtiens pas le hash MD5 de la chaîne de test (j'ai vérifié)

Le constructeur SHash() semble ne pas être nécessaire maintenant, mais semble avoir été nécessaire il y a quelques jours ;))) Donc, au début, il n'était pas là, puis j'ai corrigé une erreur de compilation quelque part avec ce constructeur vide, ou lors de la comparaison de structures ou pendant l'initialisation... en général, il y a une forte probabilité que.... soit nécessaire bien qu'il semble être une bonne règle d'initialiser toutes les variables....

en général, j'aurais aimé avoir une variante ou sans ambiguïté - non )))

SHash(0.0)

mais devinez le par vous-même ?)))

 
Vladimir Simakov:

mais devinez vous-même...))

SHash((double)x)
 
Vladimir Simakov:

et le deviner vous-même ?)))

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

Oh, mec, ça marche !

Je crois que j'ai aussi essayé de cette façon, je ne sais pas pourquoi ça n'a pas marché.

Merci !

mal foutu (( !)

 
Alexandr Andreev:

Oui, et où trouve-t-on le x dans le constructeur de la classe?))

 
Vladimir Simakov:

Oui, et d'où vient x dans le constructeur de la classe ).

le point n'est pas sur x) mais qu'il peut y avoir un flotteur sur l'extrémité de réception, juste 0.0 n'est pas fiable non plus

 
Alexandr Andreev:

le point n'est pas le x) mais qu'il peut y avoir un flotteur sur le récepteur en plus du duble, et spécifier juste 0.0 n'est pas non plus fiable

bien que tout ceci ne soit qu'un détail... pas particulièrement important

 
Alexandr Andreev:

le point n'est pas sur x) mais qu'il peut y avoir un flottement sur la réception par le duble, donc spécifier juste 0.0 est aussi peu fiable.

Peu importe ce qu'il faut initialiser ici, même int - n'importe quel nombre pour appeler ce constructeur

et j'ai choisi 0.0 pour éviter les fautes d'impression - tout chiffre, c'est-à-dire 0.0. est plus difficile à écrire et à fausser que 123.