Erreurs, bugs, questions - page 1785

 
A100:
J'en ai besoin pour la compatibilité avec le code C++, car les destructeurs sont différents dans ce cas.
Je l'ai, merci. Faites-vous beaucoup de portage vers MQL5 ? - C'est pour cela que les exemples sont si spécifiques ?
 
fxsaber:
Je sais à quoi sert le destructeur. Je ne comprends pas pourquoi nous devons ajouter le mot virtuel avant sa définition.

Fonctions virtuelles et destructeur >>>

La règle de base : si vous avez au moins une fonction virtuelle dans votre classe, le destructeur doit également être virtuel. N'oubliez pas que le destructeur n'est pas virtuel par défaut, vous devez donc le déclarer explicitement. Si vous ne le faites pas, vous êtes presque certain d'avoir des fuites de mémoire dans votre programme. Encore une fois, il ne faut pas être très intelligent pour comprendre pourquoi. Examinons plusieurs exemples.

 
fxsaber:
Je l'ai, merci. Faites-vous beaucoup de portage vers MQL5 ? - C'est pour cela que les exemples sont si spécifiques ?
Je ne fais pas beaucoup de portage. Spécifique seulement à première vue. Certains "experts" ont écrit ici que plus de 3 classes dérivées est nuisible. J'ai souvent seulement 3-4 classes de base qui ont besoin d'une initialisation appropriée et seulement alors les vrais dérivés viennent.
 
int main()
{
    A * pA = new B;
    delete pA;
    return EXIT_SUCCESS;
}

Cette fois, l'objet est construit comme il se doit, mais lorsqu'il est détruit, une fuite de mémoire se produit, car le destructeur de la classe dérivée n'est pas appelé.

La raison en est que la suppression est effectuée par le biais d'un pointeur vers une classe de base et que le compilateur utilise une liaison précoce pour appeler le destructeur. Le destructeur de la classe de base ne peut pas appeler le destructeur de la classe dérivée car il ne sait rien de celle-ci. En conséquence, une partie de la mémoire allouée à la classe dérivée est irrémédiablement perdue.

Pour éviter cela, le destructeur de la classe de base doit être déclaré comme virtuel.

Je ne comprends pas, d'un point de vue architectural, pourquoi, en rendant le destructeur de base virtuel, des informations sur le destructeur dérivé apparaissent.

Je comprends maintenant que lorsque la base est virtuelle, en définissant un destructeur dérivé, nous remplaçons le destructeur de la base par un destructeur dérivé. Mais alors le destructeur de la base ne devrait pas être appelé dans cet exemple.

De toute évidence, je ne comprends pas comment cela fonctionne. Je n'ai jamais eu de problèmes avec les fonctions virtuelles dans MQL5. J'aime beaucoup les OOP à cause d'eux. Je pensais avoir tout compris. Maintenant, j'ai un vrai dilemme. Expliquez-le-moi en vos propres termes.

 
A100:
Le portrait d'un petit. Spécifique seulement à première vue. Certains "experts" ont écrit ici que TOUT ce qui dépasse les 3 classes dérivées est nocif. Je n'ai souvent que 3 ou 4 classes de base à initialiser correctement et ce n'est qu'ensuite que les vrais dérivés commencent.
J'aimerais voir un exemple de la façon dont les professionnels (de mon point de vue) écrivent en MQL5.
 
fxsaber:

Mais alors le destructeur de la base ne devrait pas être appelé dans cet exemple.

Il est appelé implicitement par le destructeur dérivé. C'est d'ailleurs ce qui la différencie des simples fonctions virtuelles.
 
Комбинатор:
Il est appelé implicitement par le destructeur dérivé. C'est en fait ce qui la différencie des simples fonctions virtuelles.
Merci. Il s'avère que le destructeur virtuel n'est pas simplement une fonction virtuelle appelée pendant la destruction d'un objet, mais une entité plus délicate.
 
fxsaber:
Il doit supprimer l'objet. C'est la partie la plus délicate.
 
Alexey Kozitsyn:

L'erreur SymbolInfoTick() renvoie des données non pertinentes - dépassement de tick. Build 1525 x64. Test à partir de l'indicateur, n'a pas été testé sur Expert Advisor :

Real, Opening, Access Server V. La tristesse ! Faites attention au problème, s'il vous plaît. Et aussi au problème de la demande#1598238 (à partir de la page 10, post du2017.01.26 09:43).

Chers développeurs, corrigeons les tics ! Code fourni, voilà le problème, pas besoin de chercher quoi que ce soit, il suffit de réagir et de le régler !

Si nous remplaçons OnCalculate par OnTick, aucune erreur ne se produit. Le problème n'est pas dans SymbolInfoTick, le problème est que les indicateurs sont mal configurés pour ne pas sauter.
 
fxsaber:
Si OnCalculate est remplacé par OnTick, aucune erreur ne se produit. Le problème n'est pas SymbolInfoTick, mais le fait que les indicateurs ne sont pas correctement paramétrés pour l'absence de sauts.
Combien de temps avez-vous fait des mesures ? Et qu'est-ce que le réglage des indicateurs a à voir avec cela ? L'heure d'arrivée du tick actuel est 10, l'heure d'arrivée du tick précédent est 11. Il y a une erreur dans la fonction qui ne renvoie pas la valeur actuelle. Vous êtes d'accord pour dire que la valeur temporelle actuelle ne peut pas être inférieure à la précédente, n'est-ce pas ?
Raison: