Discussion de l'article "Les bases de la programmation orientée objet" - page 3

 

1) Je pensais qu'il y avait une erreur ici :

Section : Passer des paramètres au constructeur

"La fonction Init() est mise de côté dans la section privée pour s'assurer que la classe peut être réinitialisée".

possible :

La fonction Init() est mise de côté dans la section public afin de permettre la réinitialisation de la classe.

2) Veuillez donner un exemple d'utilisation de la fonctionnalité"create an array with class instances (objects)" pour la section "ObjectArray". Malheureusement, je n'arrive pas à comprendre "à quoi cela sert".

3) Dans la section "En savoir plus sur l'encapsulation (private, protected, public)", le descendant classe de base->classe est mentionné en passant. Peut-être que cette donnée(class Class : public CBase) devrait être expliquée au début de la section, car je m'en suis rendu compte plus tard.

4) n'a pas trouvé:Fig.6. La visibilité de la fonction "extra" (flèche rouge) est déterminée par le type de pointeur avec lequel la classe est chargée. Cet exemple se trouve en annexe dans le fichier OOP_sDefaultVirtual_1.mq5.

5) Je n'ai pas trouvé d'indication claire sur ce qu'est une bibliothèque. Apparemment, une façon de stocker la (les) classe(s) des fonctions ? c'est-à-dire similaire au fichier include, sauf que le fichier include est stocké en tant que source, et la bibliothèque en tant que dll compilée ?

Merci beaucoup pour cet article ! J'ai été particulièrement satisfait de la présentation cohérente du matériel.

Документация по MQL5: Основы языка / Функции / Передача параметров
Документация по MQL5: Основы языка / Функции / Передача параметров
  • www.mql5.com
Основы языка / Функции / Передача параметров - Документация по MQL5
 
bivmail:

1) Je pensais qu'il y avait une erreur ici :

Section : Passer des paramètres au constructeur

"La fonction Init() est mise de côté dans la section privée pour s'assurer que la classe peut être réinitialisée".

possible :

La fonction Init() est mise de côté dans la section public afin de permettre la réinitialisation de la classe.

2) Veuillez donner un exemple d'utilisation de la fonctionnalité"create an array with class instances (objects)" pour la section "ObjectArray". Malheureusement, je n'arrive pas à comprendre "à quoi cela sert".

3) Dans la section "En savoir plus sur l'encapsulation (private, protected, public)", le descendant classe de base->classe est mentionné en passant. Peut-être que cette donnée(class Class : public CBase) devrait être expliquée au début de la section, car je m'en suis rendu compte plus tard.

4) n'a pas trouvé:Fig.6. La visibilité de la fonction "extra" (flèche rouge) est déterminée par le type de pointeur avec lequel la classe est chargée. Cet exemple se trouve en annexe dans le fichier OOP_sDefaultVirtual_1.mq5.

5) Je n'ai pas trouvé d'indication claire sur ce qu'est une bibliothèque. Apparemment, une façon de stocker la (les) classe(s) des fonctions ? c'est-à-dire similaire au fichier include, sauf que le fichier include est stocké en tant que source, et la bibliothèque en tant que dll compilée ?

Merci beaucoup pour cet article ! J'ai été particulièrement satisfait de la présentation cohérente du matériel.

1. Oui.

2. Il y a un exemple dans la section "Tableau d'objets", en fait toute la section est un exemple avec une description.

3. La section "Utilisation de la POO pour modifier la logique de fonctionnement du programme" en tient compte.

4. La mention "Cet exemple se trouve en annexe dans le fichier..." signifie que le fichier contient un exemple pour la section indiquée par l'en-tête de la section. Cela ne signifie pas que les exemples reprennent tout ce qui est écrit dans l'article. Ces exemples peuvent ne pas exister du tout, tout est écrit dans l'article. Mais les exemples sont là, vous pouvez les prendre comme base et expérimenter. L'article est principal, les exemples sont secondaires.

5. Уже давно указано: http://ru.wikipedia.org/wiki/%C1%E8%E1%EB%E8%EE%F2%E5%EA%E0_(%EF%F0%EE%E3%F0%E0%EC%EC%E8%F0%EE%E2%E0%ED%E8%E5)

[Supprimé]  
Merci, bon article.
[Supprimé]  

Article très intéressant, écrit dans un langage compétent et "accessible".

Merci à l'auteur.

 
Merci beaucoup. Cet article m'a beaucoup aidé. J'étais en train de migrer mon EA vers la POO et j'avais un problème particulier avec les tableaux de classes. Les pointeurs dynamiques sont clairement et parfaitement expliqués. Merci encore.
 
Article très bien écrit, j'ai fini par le comprendre grâce à l'auteur.
 

J'ai deux exemples de code basés/copiés à partir de cet article. Ils créent tous les deux un tableau de pointeurs vers une classe et les suppriment à la sortie. Cependant, l'un d'eux sort avec une fuite de mémoire et l'autre sort sans fuite de mémoire. La seule différence est que dans le deuxième exemple, l'alerte dans le destructeur est commentée. Lorsque l'alerte dans le destructeur est supprimée, il y a une fuite de mémoire. C'est très bizarre. Quelqu'un peut-il m'expliquer ? S'il vous plaît, aidez-moi, cela me rend fou.

A la fin des exemples de code de cet article, j'ai inclus un exemple extrêmement simple de code que j'ai écrit et qui a également une fuite de mémoire. Encore une fois, pourquoi ???? Il n'y a rien de compliqué dans ce dernier exemple de code...


Ce code fonctionne sans fuite de mémoire :

class CName
  {
private:
   int               m_arg; // Variable pour l'instance
public:
                     CName(int aArg)
     { // Constructeur
      m_arg=aArg;
      //Alert("Constructor "+IntegerToString(m_arg)) ;
     }
                    ~CName()
     { // Destructeur
      Alert("Destructor "+IntegerToString(m_arg));
     }
  };
//---
CName *cname[]; // Tableau

void OnInit()
  {
// Préparer un tableau pour charger dix instances de la classe
   ArrayResize(cname,10);

   for(int i=0;i<10;i++)
     { // Chargement des instances
      cname[i]=new CName(i);
     }
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   for(int i=0;i<10;i++)
     { // A la fin, décharger toutes les instances de la mémoire
      delete(cname[i]);
     }
}

Messages du journal de l'expert, pas de fuite de mémoire :

PI 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructeur 0

KP 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructeur 1

JG 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructeur 2

EN 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructeur 3

LF 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructeur 4

OM 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructeur 5

FD 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructeur 6

IK 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructeur 7

HS 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructeur 8

CJ 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructeur 9

Ce code sort AVEC une fuite de mémoire !!!! Why ????????? La seule différence est de commenter le 'Alert' dans le destructeur...

class CName
     {
private:
   int               m_arg; // Variable pour l'instance
public:
                     CName(int aArg)
     { // Constructeur
      m_arg=aArg;
      //Alert("Constructor "+IntegerToString(m_arg)) ;
     }
                    ~CName()
     { // Destructeur
      //Alert("Destructeur "+IntegerToString(m_arg)) ;
     }
  };
//---

CName *cname[]; // Tableau

void OnInit()
  {
// Préparer un tableau pour charger dix instances de la classe
   ArrayResize(cname,10);

   for(int i=0;i<10;i++)
     { // Chargement des instances
      cname[i]=new CName(i);
     }
  }

//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   for(int i=0;i<10;i++)
     { // A la fin, décharger toutes les instances de la mémoire
      delete(cname[i]);
     }
}

Messages du journal de l'expert, note de la fuite de mémoire :

FM 1 OOP_sConstDestr_2 (EURUSD,M1) 13:51:19 10 objets non supprimés restants

EG 1 OOP_sConstDestr_2 (EURUSD,M1) 13:51:19 10 objets de type CName restants

GO 1 OOP_sConstDestr_2 (EURUSD,M1) 13:51:19 200 octets de fuite de mémoire

Dernier exemple, mon code, très simple mais qui sort avec une fuite de mémoire....

class CCandleStick
{
public:
   CCandleStick() { };
  ~CCandleStick() { };
};

CCandleStick *cCandleArray[];

//+------------------------------------------------------------------+
//| Fonction d'initialisation de l'expert|
//+------------------------------------------------------------------+
void OnInit()
  {
   ArrayResize(cCandleArray, 10);
   for (int i = 0; i < 10; i++) {
      cCandleArray[i] = new CCandleStick();
   }   
  }
//+------------------------------------------------------------------+
//| Fonction de désinitialisation de l'expert|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   for (int i = 0; i < 10; i++) {
      delete(cCandleArray[i]);
   }   
   Print("Last Error- ", GetLastError(), "   Current time: ", TimeCurrent());
  }

Messages du journal de l'expert, note de la fuite de mémoire :

MR 0 tester (EURUSD,M1) 14:07:23 Dernière erreur- 0 Heure actuelle : 2013.02.06 23:07:23

FL 1 testeur (EURUSD,M1) 14:07:23 10 objets non supprimés restants

KN 1 testeur (EURUSD,M1) 14:07:23 10 objets de type CCandleStick restants

JS 1 testeur (EURUSD,M1) 14:07:23 160 octets de mémoire fuient



Documentation on MQL5: Date and Time / TimeCurrent
  • www.mql5.com
Date and Time / TimeCurrent - Documentation on MQL5
 
wulidancing:

J'ai deux exemples...

J'ai vérifié les trois varaints. Les trois sont identiques. Toutes sont normales. Aucune ne donne lieu à des fuites. Dans ces exemples, ce n'est pas possible - nous avons le tableau, dans chaque élément du tableau il y a une instance, lorsque nous terminons nous supprimons tous les objets. Les objets ne créent pas de copies d'eux-mêmes, vous ne pouvez pas manquer de supprimer quelque chose de semblable. Si l'objet crée une copie de lui-même, alors nous pouvons avoir des difficultés avec la suppression, il est très facile de rater quelque chose. Montrer les variantes qui ont vraiment des fuites.

Utilisez le bouton SRC pour insérer le code (mieux - attachez les fichiers).

Désolé pour mon anglais :)

MQL5.community - User Memo
  • 2010.02.25
  • MetaQuotes Software Corp.
  • www.mql5.com
You have just registered and most likely you have questions such as, "How do I insert a picture to my a message?" "How do I format my MQL5 source code?" "Where are my personal messages kept?" You may have many other questions. In this article, we have prepared some hands-on tips that will help you get accustomed in MQL5.community and take full advantage of its available features.
 
La POO est un langage de programmation moderne, mais pour le comprendre et rédiger un code, il faut beaucoup de temps et d'attention. Merci pour ce bon article
 
Integer:

J'ai vérifié les trois varaints. Les trois sont identiques. Elles sont toutes normales. Aucune ne donne lieu à des fuites. Dans ces exemples, ce n'est pas possible - nous avons le tableau, dans chaque élément du tableau il y a une instance, lorsque nous terminons nous supprimons tous les objets. Les objets ne créent pas de copies d'eux-mêmes, vous ne pouvez pas manquer de supprimer quelque chose de semblable. Si l'objet crée une copie de lui-même, alors nous pouvons avoir des difficultés avec la suppression, il est très facile de rater quelque chose. Montrer les variantes qui ont vraiment des fuites.

Utilisez le bouton SRC pour insérer le code (mieux - attachez les fichiers).

Désolé pour mon anglais :)

Merci beaucoup d'avoir pris le temps de répondre. Je ne suis pas sûr que vous ayez vu ma question complémentaire. Elle était dans un commentaire séparé qui a probablement été supprimé parce que je ne suis pas très familier avec ce forum. Cependant, j'ai essayé d'exécuter les trois exemples sur un ancien ordinateur avec une ancienne version de MetaTrader. Dans l'ancienne version, les trois semblent fonctionner correctement. Il n'a pas généré d'erreur de fuite de mémoire dans le journal de l'expert, je pense qu'il s'agissait de la build 560 ???Je crois que c'était la version 560 ? Je ne me souviens pas et j'ai mis à jour la version 560 vers la nouvelle version 756. Après la nouvelle version, j'ai les mêmes problèmes de fuite de mémoire. Est-il possible que l'ancienne version n'ait pas signalé les problèmes de fuite de mémoire parce que ce n'était pas une fonctionnalité ? Quelle version utilisez-vous ? Merci encore.