GetPointer

A função retorna o ponteiro de objeto.

void*  GetPointer(
   any_class anyobject      // objeto de qualquer classe
   );

Parâmetros

anyobject

[in]  Objeto de qualquer classe.

Valor do Retorno

A função retorna o ponteiro de objeto.

Observação

Somente objetos de classe têm ponteiros. Instâncias de estruturas e variáveis de tipo simples não podem ter ponteiros. O objeto de classe não criado usando o operador new(), mas, por exemplo, criado automaticamente no array de objetos, tem um ponteiro. Mas este ponteiro será do tipo automático POINTER_AUTOMATIC, portanto o operador delete() não pode ser aplicado a ele. Além de que, o tipo ponteiro não difere dos ponteiros dinâmico do tipo POINTER_DYNAMIC.

Como variáveis de tipo estrutura e de tipo simples não têm ponteiros, é proibido aplicar a função GetPointer() a elas. É também proibido passar o ponteiro como um argumento de função. Nos outros casos o resultado é indefinido.

Uma tentativa de chamar um ponteiro incorreto causa a finalização crítica de um programa. É por isso que a função CheckPointer() deve ser chamada antes de usar um ponteiro. Um ponteiro pode estar incorreto nos seguintes casos:

  • o ponteiro é igual a NULL;
  • o objeto foi excluído usando o operador delete.

Esta função pode ser usada para verificar a validade de um ponteiro. Um valor não-zero garante que o ponteiro pode ser usado para acesso.

Exemplo:

//+------------------------------------------------------------------+
//|                                             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 implementando o elemento da 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("Destrutor de ",m_id,
                                     (CheckPointer(GetPointer(this))==POINTER_DYNAMIC)?
                                     "dynamic":"não dinâmico"); }
   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 mais simples de lista                                     |
//+------------------------------------------------------------------+
class CMyList
  {
   CItem*            m_items;
public:
                     CMyList() { m_items=NULL; }
                    ~CMyList() { Destroy(); }
    bool             InsertToBegin(CItem* item);
    void             Destroy();
  };
//+------------------------------------------------------------------+
//| Incluindo elemento de lista no começo                            |
//+------------------------------------------------------------------+
bool CMyList::InsertToBegin(CItem* item)
  {
   if(CheckPointer(item)==POINTER_INVALIDreturn(false);
//---
   item.Next(m_items);
   m_items=item;
//---
   return(true);
  }
//+------------------------------------------------------------------+
//| Excluindo a lista através da exclusão dos elementos              |
//+------------------------------------------------------------------+
void CMyList::Destroy()
  {
//--- ponteiro de serviço para trabalhar em um loop
   CItem* item;
//--- varre o loop e tenta excluir ponteiros 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()," para ser excluído");
         delete (item);
        }
      else Print("Objeto não-dinâmico ",item.Identifier()," cannot be deleted");
     }
//---
  }
//+------------------------------------------------------------------+
//| Função start do programa script                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   CMyList list;
   CItem   items[10];
   CItem*  item;
//--- cria e adiciona na lista um ponteiro de objeto dinâmico
   item=new CItem;
   if(item!=NULL)
     {
      item.Initialize(100,"dinâmico");
      item.PrintMe();
      list.InsertToBegin(item);
     }
//--- adiciona ponteiros automáticos na lista
   for(int i=0; i<10; i++)
     {
      items[i].Initialize(i,"automático");
      items[i].PrintMe();
      item=GetPointer(items[i]);
      if(CheckPointer(item)!=POINTER_INVALID)
         list.InsertToBegin(item);
     }
//--- adiciona mais um ponteiro de objeto dinâmico no começo da lista
   item=new CItem;
   if(item!=NULL)
     {
      item.Initialize(200,"dinâmico");
      item.PrintMe();
      list.InsertToBegin(item);
     }
//--- exclui todos os elementos da lista
   list.Destroy();
//--- todos os elementos da lista será excluídos após o script terminar
//--- veja a guia Experts no terminal
  }

Também Veja

Ponteiros de Objetos, Verificação do Ponteiro de Objeto, Exclusão de Objeto Operador delete