GetPointer

La funzione restituisce l'oggetto pointer.

void*  GetPointer(
   any_class anyobject      // oggetto di qualsiasi classe
   );

Parametri

anyobject

[in]  Oggetto di qualsiasi classe.

Valore restituito

La funzione restituisce il puntatore all'oggetto.

Nota

Solo gli oggetti della classe hanno puntatori. Le istanze delle strutture e variabili di tipo semplice non possono avere puntatori. L'oggetto della classe creato non usando l'operatore new(), ma, ad esempio, creato automaticamente nell'array di oggetti, ha ancora un puntatore. Ma questo puntatore sarà di tipo automatico POINTER_AUTOMATIC, pertanto l'operatore delete() non può essere applicato. A parte questo, il puntatore tipo non differisce da puntatori dinamici di tipo POINTER_DYNAMIC.

Poiché le variabili di tipo strutture e di tipo semplice non sono puntatori, è vietato applicare la funzione GetPointer() per esse. E' anche vietato passare il puntatore come argomento di funzione. In tutti questi casi il compilatore notificherà un errore.

Un tentativo di chiamare un puntatore errato provoca la terminazione critica del programma. Ecco perché la funzione CheckPointer() deve essere chiamata prima di utilizzare un puntatore. Un puntatore può essere corretto nei seguenti casi:

  • il puntatore è uguale a NULL;
  • l'oggetto è stato eliminato con l'operatore delete.

Questa funzione può essere utilizzata per verificare la validità di un puntatore. Un valore non-zero garantisce, che il puntatore può essere utilizzato per accedere.

Esempio:

//+--------------------------------------------------------------------------------+
//|                                                           Check_GetPointer.mq5 |
//|                                      Copyright 2009, MetaQuotes Software Corp. | 
//|                                                           https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
//+--------------------------------------------------------------------------------+
//| Classe che implementa gli elementi della lista                                 |
//+--------------------------------------------------------------------------------+
class CItem
  {
   int               m_id;
   string            m_comment;
   CItem*            m_next;
public:
                     CItem() { m_id=0; m_comment=NULL; m_next=NULL; }
                    ~CItem() { Print("Distruttore di ",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; }
  };
//+--------------------------------------------------------------------------------+
//| Più semplice classe della lista                                                |
//+--------------------------------------------------------------------------------+
class CMyList
  {
   CItem*            m_items;
public:
                     CMyList() { m_items=NULL; }
                    ~CMyList() { Destroy(); }
    bool             InsertToBegin(CItem* item);
    void             Destroy();
  };
//+--------------------------------------------------------------------------------+
//| Inserisce gli elementi della lista all'inizio                                  |
//+--------------------------------------------------------------------------------+
bool CMyList::InsertToBegin(CItem* item)
  {
   if(CheckPointer(item)==POINTER_INVALIDreturn(false);
//---
   item.Next(m_items);
   m_items=item;
//---
   return(true);
  }
//+--------------------------------------------------------------------------------+
//| Elimina la lista eliminando gli elementi                                       |
//+--------------------------------------------------------------------------------+
void CMyList::Destroy()
  {
//--- puntatore di servizio per lavorare in un loop
   CItem* item;
//--- passa attraverso il loop e tenta di eliminare i puntatori dinamici
   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("L' oggetto non-dinamico ",item.Identifier()," non può essere eliminato");
     }
//---
  }
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script                                         |
//+--------------------------------------------------------------------------------+
voidOnStart()
  {
   CMyList list;
   CItem   items[10];
   CItem*  item;
//--- crea ed aggiunge nella lista un puntatore oggetto dinamico
   item=new CItem;
   if(item!=NULL)
     {
      item.Initialize(100,"dynamic");
      item.PrintMe();
      list.InsertToBegin(item);
     }
//--- aggiunge puntatori automatici nella lista
   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);
     }
//--- aggiunge uno o più oggetti puntatori dinamici all'inizio della lista
   item=new CItem;
   if(item!=NULL)
     {
      item.Initialize(200,"dynamic");
      item.PrintMe();
      list.InsertToBegin(item);
     }
//--- elimina tutti gli elementi della lista
   list.Destroy();
//--- tutti gli elementi della lista verranno eliminati dopo che lo script è andato
//--- vedere la scheda Experts nel terminale
  }

Vedi anche

Object Pointers, Checking the Object Pointer, Object Delete Operator delete