Erreurs, bugs, questions - page 2359

 

Dans Visual Studio, mon exemple fonctionne également. Je parlais de l'opérateur de copie explicite et je l'ai expliqué par le code.

Je l'ai écrit juste au cas où, pour que si vous désactivez l'explicite, vous ne le désactiviez pas accidentellement en même temps.

 
A100:

Dans Visual Studio, mon exemple fonctionne également. Je parlais de l'opérateur de copie explicite et je l'ai expliqué par le code.

Je ne parlais pas de l'opérateur explicite, mais de l'inadmissibilité de l'opérateur implicite dans ce cas, que vous avez qualifié d'"étroitesse d'esprit", ce qui n'est pas le cas.

Si vous devez faire une copie, vous devez d'abord explicitement attribuer à b le type correct en C++. Car une telle copie constitue une violation de l'encapsulation des objets. C'est pourquoi il ne devrait pas être question d'implication.

 
A100:

Je voulais dire un opérateur de copie explicite et je l'ai expliqué en code.

À propos, si la classe A hérite également d'une classe X, alors votre classe B n'est en aucun cas protégée de la copie de X (nous parlons de MQL). Vous devez écrire des opérateurs pour TOUTES les classes parentes.
 
A100:

Je doute que le compilateur les sépare (dans le contexte du code) en explicite et implicite. Sinon, il serait facile de le réparer

Le fait est qu'un opérateur implicite correspond toujours au type d'un objet, c'est-à-dire que si un objet est de type B, son opérateur implicite est de type const B&. Il ne prend pas le type A. Mais c'est le C++.
 

Au fait, le type d'opérateur semble correct.

Il cherche d'abord l'opérateur B: :, s'il est absent, puis il cherche l'opérateur A: :, s'il est absent là aussi, alors il considère que son devoir est accompli et ne fait rien (bien que le pointeur soit cassé en conséquence) :)

 
Ilya Malev:

s'il n'est pas là non plus, alors il considère que son devoir est accompli et ne fait rien (bien que le pointeur soit éventuellement cassé) :)

Pourquoi ça ne fait rien ? Il copie par opérateur=(const A&) implicite (automatique), ce qu'il ne devrait pas faire.

Et enfin, supprimez cet astérisque après B, il vous fait mal aux yeux ;) Nous avons déjà tout compris avec ce bug.

 
Alexey Navoykov:

Et enfin enlevez l'astérisque après B, ça fait mal à l'œil ;) Il a déjà tout compris avec ce bug.

Personnellement, je trouve les variables d'objet sans astérisque dérangeantes ;)) Un des bugs désagréables est d'écrire A a=new A au lieu de *a et de ne pas comprendre ce qui ne va pas pendant un long moment) J'ai, au contraire, montré que tout fonctionne correctement si on suit votre conseil et qu'on déclare un op.=& privé. Dans ce cas, l'éditeur produira immédiatement une erreur. Je le ferai de cette façon à partir de maintenant ;))

 
J'ai passé quelques heures à chercher des divergences. J'ai trouvé ceci
#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{
  const double Koef =  0.25;
  const int iDelta = 32;
  const double point = 0.00001;
  
  const double high = 1.06736;
  const double low = 1.06676;
  
  const double Avg = (high + low) * 0.5;  
  const double Size = (high - low) * Koef * 0.5;  
  
  PRINT(DoubleToString(Avg - Size - point * iDelta, 5));   // DoubleToString(Avg-Size-point*iDelta,5) = 1.06666
  PRINT(DoubleToString(Avg - (Size + point * iDelta), 5)); // DoubleToString(Avg-(Size+point*iDelta),5) = 1.06667
} 


Les particularités sont doubles, mais pas telles que si l'on change l'ordre d'addition (sauf pour les nombres relativement très différents), le résultat est différent ! Expliquez à un idiot pourquoi cela se produit ici ?

Il suffit de regarder les deux dernières lignes de la source.

 

Erreur pour les développeurs.

Le script ne se compile pas, identifiez pourquoi))). Utilisez le fichier joint.


Même dossier :


Dossiers :
Test1.mq5  9 kb
 
Aliaksandr Hryshyn:

Erreur pour les développeurs.

Le script ne se compile pas, identifiez pourquoi))). Utilisez le fichier joint.


Même dossier :


Toutes les compilations, supprimer la ligne d'erreur

Raison: