Discussion de l'article "Utilisation des pointeurs d'objet dans MQL5" - page 2

 

Bonjour. Je suis débutant. J'ai une question concernant l'utilisation de l'icône "*" (astérisque).

Dans le fichier samplelist :

class CListItem
  {
private:
   int               ID;
   CListItem        *next;
   CListItem        *prev;

"*" est utilisé pour déclarer un pointeur sur un objet - c'est assez clair.

Ensuite :

public:
                    ~CListItem();
   ...
   CListItem*        next(){return(next);}
   CListItem*        prev(){return(prev);}

L'utilisation du signe "*" n'est pas claire.

Selon l'aide,"il est possible de créer dynamiquement des objets d'un type complexe. Le nouvel opérateur n'est pas utilisé ici. Veuillez expliquer plus en détail comment et dans quels cas le signe "*" peut être utilisé.

Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5
 
kogriv:

En outre, cependant :

La signification du signe "*" placé à cet endroit n'est pas claire.


On peut écrire ceci

public:
                    ~CListItem();
   ...
   CListItem        *next(){return(next);}
   CListItem        *prev(){return(prev);}

Il n'y aura pas de différence, il s'agit seulement du style de conception et d'une petite approche idéologique.

 
Rosh:

Vous pouvez l'écrire comme suit

Il n'y aura pas de différence, il s'agit seulement du style de conception et d'une petite approche idéologique.

Par exemple, ceci est une déclaration d'un pointeur vers l'objet (ou la méthode ?) next() ?

CListItem        *next(){return(next);}

il s'agit d'une déclaration d'un pointeur sur l'objet (ou la méthode ?) next() ? Et ensuite, entre parenthèses, l'objet next lui-même est renvoyé... Est-ce que je comprends bien ?

Je comprends que tout devrait être très simple, mais comme je n'ai jamais rencontré la POO auparavant, je m'égare dans 3 pins. Faites-moi comprendre, s'il vous plaît.

 
kogriv:

C'est-à-dire.

est une déclaration d'un pointeur sur l'objet (ou la méthode ?) next() ?

Il est dit que la fonction next() renvoie un pointeur sur une variable de la classe CListItem.
 
kogriv:

Puis, entre accolades, l'objet suivant lui-même est renvoyé. Ai-je bien compris ?

Le corps de la fonction est entre accolades,

{return(next);}

cela signifie que la fonction renverra la variable next, qui a le type d'un pointeur sur un objet de la classe CListItem. Cela correspond généralement au type de la fonction.

Документация по MQL5: Основы языка / Типы данных / Структуры и классы
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
  • www.mql5.com
Основы языка / Типы данных / Структуры и классы - Документация по MQL5
 

Juste après le premier exemple, l'article contient la phrase "La variable pstatus est un pointeur d'un objet, mais nous avons délibérément "oublié" de créer l'objet lui-même à l'aide de l'opérateur new et nous l'avons passé en paramètre à la fonction PrintStatus()".

1. Il n'est pas clair ce que vous avez passé "exactement" - un pointeur ou un objet ?

2. Il n'y a pas de fonction PrintStatus() dans l'exemple.

[Supprimé]  

Je pense qu'il y a une erreur :

//+------------------------------------------------------------------+
//| ajouter un élément à la liste|
//+------------------------------------------------------------------+
CList::addItem(CListItem *item)
  {
//--- vérifier d'abord l'exactitude du pointeur transmis
   if(CheckPointer(item)==POINTER_INVALID) return;
//--- augmente le nombre d'éléments de la liste
   m_counter++;
//--- s'il n'y a pas encore d'éléments dans la liste
   if(CheckPointer(first)!=POINTER_DYNAMIC)
     {
      first=item;
     }
   else
     {
      //--- mettre l'objet sur le pointeur de l'objet précédent----------------------- Début de l'erreur-----------------------
      item.prev(first);
      //--- se souvenir du pointeur du premier élément actuel
      CListItem *p=first;
      //--- mettre l'élément entrant à la place du premier élément
      first=item;
      //--- définir le pointeur de l'objet suivant pour le premier élément de la liste
      first.next(p);
     }
  } 
Il semble que le nouvel élément de la liste ait prev et first référençant le deuxième élément, et le deuxième élément ne reçoit pas de référence au premier élément.
 
Yedelkin:

Juste après le premier exemple, l'article contient la phrase suivante : "La variable pstatus est un pointeur d'objet, mais nous avons délibérément "oublié" de créer l'objet lui-même avec l'opérateur new et nous l'avons passé en paramètre à la fonction PrintStatus()".

1. On ne sait pas exactement ce qui a été passé : un pointeur ou un objet ?

2. Il n'y a pas de fonction PrintStatus() dans l'exemple.

Mieux vaut tard que jamais. Merci, c'est corrigé dans l'article. La fin de la phrase a été supprimée

Juste après le premier exemple, l'article contient la phrase "La variable pstatus est un pointeur d'un objet, mais nous avons délibérément "oublié" de créer l'objet lui-même en utilisant l'opérateur new et nous l'avons passé comme paramètre à la fonction PrintStatus()".

 
220Volt:

Je pense qu'il y a une erreur :

Il semble que le nouvel élément de la liste ait prev et first référençant le deuxième élément, et que le deuxième élément ne reçoive pas de référence au premier élément.

Oui, il y a une faute de frappe. Au lieu de

 else
     {
      //--- définir l'article  указатель предыдущего объекта                                         
      item.prev(first);

doit être

else
     {
      //--- pour la première fois указатель предыдущего объекта
      first.prev(item);
corrigé.
[Supprimé]  

Je ne comprends toujours pas ce que sont les pointeurs et les références dans MQL5 et maintenant dans MQL4. Quelle est la différence entre le passage par référence et le pointeur, si ce n'est du code supplémentaire ? Il y a une différence en C++, mais quelle est-elle ici ? Si ce n'est pas difficile, veuillez écrire des informations plus détaillées.