GetPointer

函数返回 指针 对象。

void*  GetPointer(

   any_class anyobject      // 任何类的对象

   );

参量

anyobject

[in]  任一类的对象。

返回值

函数返回对象指针

注释

只有分类对象有指标,例如架构和简单类型变量没有指标。分类对象不能使用new()操作建立,但是,例如,数组对象会自动建立,直到产生指标。但是该指标会是自动类型POINTER_AUTOMATIC,因此delete()操作不能应用,该类型指标与动态 POINTER_DYNAMIC 类型指标不同。

结构类型变量和简单类型没有指标,也禁止应用GetPointer()函数。也禁止以函数论据传递指标,在此情况下,编译器会通知出现一个错误。

想要调用引起程序 危险终止 的错误指标,这就是使用指标之前调用 CheckPointer() 函数的原因,如下情况指标错误:

  • 指标等于 NULL
  • 使用 delete 操作对象删除;

该函数可用来有效检验指标,保证非零值,该指标可用于访问。

示例:

//+------------------------------------------------------------------+

//|                                             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 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; }

  };

//+------------------------------------------------------------------+

//| 列表中最简单的类                                                   |

//+------------------------------------------------------------------+

class CMyList

  {

   CItem*            m_items;

public:

                     CMyList() { m_items=NULL; }

                    ~CMyList() { Destroy(); }

    bool             InsertToBegin(CItem* item);

    void             Destroy();

  };

//+------------------------------------------------------------------+

//| 从开始嵌入列表元素                                                  |

//+------------------------------------------------------------------+

bool CMyList::InsertToBegin(CItem* item)

  {

   if(CheckPointer(item)==POINTER_INVALID) return(false);

//---

   item.Next(m_items);

   m_items=item;

//---

   return(true);

  }

//+------------------------------------------------------------------+

//| 通过删除元素删除列表                                                |

//+------------------------------------------------------------------+

void CMyList::Destroy()

  {

//--- 循环工作服务指针

   CItem* item;

//--- 循环检测并删除动态指针

   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");

     }

//---

  }

//+------------------------------------------------------------------+

//| 脚本程序启动函数                                                   |

//+------------------------------------------------------------------+

void OnStart()

  {

   CMyList list;

   CItem   items[10];

   CItem*  item;

//--- 创建并加入一个动态对象指针到列表

   item=new CItem;

   if(item!=NULL)

     {

      item.Initialize(100,"dynamic");

      item.PrintMe();

      list.InsertToBegin(item);

     }

//--- 添加自动指针到列表

   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);

     }

//--- 在列表开始添加一个以上动态对象指针

   item=new CItem;

   if(item!=NULL)

     {

      item.Initialize(200,"dynamic");

      item.PrintMe();

      list.InsertToBegin(item);

     }

//--- 删除所有列表元素

   list.Destroy();

//--- 脚本结束后所有列表元素都被删除

//--- 末端看到专家标签

  }

另见

对象指针检测对象指针对象删除操作符的删除