GetPointer

この関数はオブジェクトポインターを返します

void *   GetPointer any_class  anyobject //任意のクラスのオブジェクト   );
         

パラメーター

任意のオブジェクト

[in]任意のクラスのオブジェクト。

戻り値

この関数はオブジェクトポインターを返します。

注意

クラスオブジェクトのみにポインターがあります。構造体および単純型変数のインスタンスは、ポインターを持つことができません。new()演算子を使用して作成されていないが、たとえばオブジェクトの配列に自動的に作成されたクラスオブジェクトには、まだポインターがあります。ただし、このポインターは自動タイプPOINTER_AUTOMATICであるため、delete()演算子は適用できません。それ以外は、タイプポインターはPOINTER_AUTOMATICタイプの動的ポインターと変わりません。

構造体型と単純型の変数にはポインターがないため、GetPointer()関数をそれらに適用することは禁止されています。ポインターを関数の引数として渡すことも禁止されています。これらのすべての場合、コンパイラーはエラーを通知します。

誤ったポインターを呼び出そうとすると、プログラムがクリティカル終了します。これが、ポインターを使用する前にCheckPointer()関数を呼び出す必要がある理由です。次の場合、ポインターは正しくない可能性があります。

  • ポインターはNULLと等しい。
  • オブジェクトは削除演算子を使用して削除されました。

この関数を使用して、ポインターの有効性を確認できます。ゼロ以外の値は、アクセスにポインターを使用できることを保証します。

例:

//+——————————————————————+
//|                                             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”
 
//+——————————————————————+
//| Class implementing the list element                              |
//+——————————————————————+
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; }
  };
//+——————————————————————+
//| Simplest class of the list                                       |
//+——————————————————————+
class CMyList
  {
   CItem*            m_items;
public:
                     CMyList() { m_items=NULL; }
                    ~CMyList() { Destroy(); }
    bool             InsertToBegin(CItem* item);
    void             Destroy();
  };
//+——————————————————————+
//| Inserts list element at the beginning                            |
//+——————————————————————+
bool CMyList::InsertToBegin(CItem* item)
  {
   if(CheckPointer(item)==POINTER_INVALIDreturn(false);
//—
   item.Next(m_items);
   m_items=item;
//—
   return(true);
  }
//+——————————————————————+
//| Deletes the list by deleting elements                            |
//+——————————————————————+
void CMyList::Destroy()
  {
//— service pointer to work in a loop
   CItem* item;
//— go through the loop and try to delete dynamic pointers
   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;
//— create and add into the list a dynamic object pointer
   item=new CItem;
   if(item!=NULL)
     {
      item.Initialize(100,“dynamic”);
      item.PrintMe();
      list.InsertToBegin(item);
     }
//— add automatic pointers into the list
   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);
     }
//— add one more dynamic object pointer at the list beginning
   item=new CItem;
   if(item!=NULL)
     {
      item.Initialize(200,“dynamic”);
      item.PrintMe();
      list.InsertToBegin(item);
     }
//— delete all the list elements
   list.Destroy();
//— all the list elements will be deleted after the script is over
//— see the Experts tab in the terminal
  }

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA


You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">