Descargar MetaTrader 5

GetPointer

Devuelve el puntero a objeto.

void*  GetPointer(
   any_class anyobject      // objeto de cualquier clase
   );

Parámetros

anyobject

[in]  Objeto de cualquier clase.

Valor devuelto

La función devuelve el puntero a objeto.

Nota

Sólo los objetos de clases tienen punteros. Las instancias de estructuras y las variables de tipos simples no tienen punteros. Un objeto de clase que no ha sido creado mediante el operador new(), sino, por ejemplo, ha sido creado automáticamente en el array de objetos, igualmente tiene un puntero. Pero este puntero va a ser del tipo automático POINTER_AUTOMATIC, y no se le puede aplicar el operador delete(). Aparte de eso, este puntero del tipo no tendrá ninguna diferencia de los punteros dinámicos del tipo POINTER_AUTOMATIC.

Debido a que las variables del tipo de estructuras y de tipos simples no tienen punteros, está prohibido aplicarles la función GetPointer(). También está prohibido pasar el puntero como argumento de la función. En todos los casos mencionados el compilador avisará sobre un error.

El intento de llamar a un puntero incorrecto lleva a la terminación crítica del programa, con lo cual es necesario usar la función CheckPointer() antes de utilizar un puntero.  Un puntero puede ser incorrecto en las siguientes ocasiones:

  • el puntero es igual a NULL;
  • si el objeto ha sido eliminado por el operador delete.

Esta función puede ser utilizada para comprobar la validez del puntero. Un valor diferente a cero garantiza que el puntero puede ser utilizado para acceder.

Ejemplo:

//+------------------------------------------------------------------+
//|                                             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"
 
//+------------------------------------------------------------------+
//|  clase que implementa el elemento de la 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("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; }
  };
//+------------------------------------------------------------------+
//|  la clase más simple de la lista                                 |
//+------------------------------------------------------------------+
class CMyList
  {
   CItem*            m_items;
public:
                     CMyList() { m_items=NULL; }
                    ~CMyList() { Destroy(); }
    bool             InsertToBegin(CItem* item);
    void             Destroy();
  };
//+------------------------------------------------------------------+
//|  inserción del elemento de la lista al principio de todo         |
//+------------------------------------------------------------------+
bool CMyList::InsertToBegin(CItem* item)
  {
   if(CheckPointer(item)==POINTER_INVALIDreturn(false);
//---
   item.Next(m_items);
   m_items=item;
//---
   return(true);
  }
//+------------------------------------------------------------------+
//|  eliminación de la lista mediante eliminación de sus elementos   |
//+------------------------------------------------------------------+
void CMyList::Destroy()
  {
//--- puntero auxiliar para trabajar en el ciclo
   CItem* item;
//--- pasamos por el ciclo e intentamos eliminar los punteros dinámicos
   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;
//--- creamos y añadimos a la lista un puntero dinámico a objeto
   item=new CItem;
   if(item!=NULL)
     {
      item.Initialize(100,"dynamic");
      item.PrintMe();
      list.InsertToBegin(item);
     }
//--- añadimos los punteros automáticos a la 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);
     }
//--- añadimos otro puntero dinámico a objeto al principio de la lista 
   item=new CItem;
   if(item!=NULL)
     {
      item.Initialize(200,"dynamic");
      item.PrintMe();
      list.InsertToBegin(item);
     }
//--- eliminamos los elementos de la lista
   list.Destroy();
//--- todos los elementos de la lista van a ser borrados,
//--- véase la pestaña Experts en el terminal
  }

Véase también

Punteros a objetos, Comprobación de puntero a objeto, Operador de eliminación de objeto delete


Actualizado: 2015.12.03