GetPointer

Rend l'indicateur de l'objet.

void*  GetPointer(
   any_class anyobject      // objet de n'importe quelle classe
   );

Paramètres

anyobject

[in] L'objet de n'importe quelle classe.

La valeur rendue

Rend l'indicateur de l'objet.

Note

Seulement les objets des classes ont les indicateurs. Les exemplaires des structures et les variables des types simples des indicateurs n'ont pas des indicateurs. L'objet de la classe, qui n'est pas créé à l'aide de l'opérateur new(), mais par exemple, automatiquement créé dans le tableau des objets, a l'indicateur tout de même. Seulement cet indicateur aura le type automatique POINTER_AUTOMATIC,et on ne peut pas lui appliquer l'opérateur delete(). Pour le reste l'indicateur du type ne se distingue pas des indicateurs dynamiques du type POINTER_DYNAMIC.

Puisque les variables comme les structures et les types simples n'ont pas les indicateurs, il est interdit d'appliquer la fonction GetPointer() à eux. Il est aussi interdit de transmettre l'indicateur comme l'argument de la fonction. Dans tous les cas énumérés le compilateur notifiera d'une erreur.

La tentative de l'appel à l'indicateur incorrect amène à l'achèvement critique du programme. C'est pourquoi il y a une nécessité de l'utilisation de la fonction CheckPointer() avant l'utilisation de l'indicateur. L'indicateur peut être incorrect dans les cas suivants:

  • l'indicateur est égal à NULL;
  • si l'objet était supprimé à l'aide de l'opérateur delete.

On peut utiliser cette fonction le contrôle de l'indicateur sur la validité. La valeur, distinguée du zéro, garantit qu'on peut avoir l'accès selon l'indicateur.

Exemple:

//+------------------------------------------------------------------+
//|                                             Check_GetPointer.mq5 |
//|                         Copyright 2000-2024, MetaQuotes Ltd. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
//+------------------------------------------------------------------+
//| Classe en exécutant l'élément de liste                           |
//+------------------------------------------------------------------+
class CItem
  {
   int               m_id;
   string            m_comment;
   CItem*            m_next;
public:
                     CItem() { m_id=0; m_comment=NULL; m_next=NULL; }
                    ~CItem() { Print("Destructor of ",m_id,
                                     (CheckPointer(GetPointer(this))==POINTER_DYNAMIC)?
                                     "dynamic":"non-dynamic"); }
   void              Initialize(int id,string comm) { m_id=id; m_comment=comm; }
   void              PrintMe() { Print(__FUNCTION__,":",m_id,m_comment); }
   int               Identifier() { return(m_id); }
   CItem*            Next() {return(m_next); }
   void              Next(CItem *item) { m_next=item; }
  };
//+------------------------------------------------------------------+
//| Classe la plus simple de la liste                                |
//+------------------------------------------------------------------+
class CMyList
  {
   CItem*            m_items;
public:
                     CMyList() { m_items=NULL; }
                    ~CMyList() { Destroy(); }
    bool             InsertToBegin(CItem* item);
    void             Destroy();
  };
//+------------------------------------------------------------------+
//| Insérer l'élément de liste au commencement                       |
//+------------------------------------------------------------------+
bool CMyList::InsertToBegin(CItem* item)
  {
   if(CheckPointer(item)==POINTER_INVALIDreturn(false);
//---
   item.Next(m_items);
   m_items=item;
//---
   return(true);
  }
//+------------------------------------------------------------------+
//| Supprimer la liste en supprimant des éléments                    |
//+------------------------------------------------------------------+
void CMyList::Destroy()
  {
//--- indicateur de service pour travailler dans une boucle
   CItem* item;
//--- passons par la boucle et essayez de supprimer les indicateurs dynamiques
   while(CheckPointer(m_items)!=POINTER_INVALID)
     {
      item=m_items;
      m_items=m_items.Next();
      if(CheckPointer(item)==POINTER_DYNAMIC)
        {
         Print("Dynamyc object ",item.Identifier()," to be deleted");
         delete (item);
        }
      else Print("Non-dynamic object ",item.Identifier()," cannot be deleted");
     }
//---
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   CMyList list;
   CItem   items[10];
   CItem*  item;
//--- créons et ajouteront à la liste l'indicateur dynamique de l'objet
   item=new CItem;
   if(item!=NULL)
     {
      item.Initialize(100,"dynamic");
      item.PrintMe();
      list.InsertToBegin(item);
     }
//--- ajoutons les indicateurs automatiques à la liste
   for(int i=0; i<10; i++)
     {
      items[i].Initialize(i,"automatic");
      items[i].PrintMe();
      item=GetPointer(items[i]);
      if(CheckPointer(item)!=POINTER_INVALID)
         list.InsertToBegin(item);
     }
//--- ajoutons encore un indicateur dynamique de l'objet au début de la liste 
   item=new CItem;
   if(item!=NULL)
     {
      item.Initialize(200,"dynamic");
      item.PrintMe();
      list.InsertToBegin(item);
     }
//---  supprimons les éléments de la liste
   list.Destroy();
//---  tous les éléments de la liste seront supprimés,
//--- regarde le signet Experts dans le terminal
  }

Voir aussi

Les indicateurs des objets, Le contrôle de l'indicateur de l'objet , L'opérateur de l'effacement de l'objet delete