下载MetaTrader 5

目标指针

在MQL5中,有可能动态地创造复杂形势的目标,被新操作执行,创造目标返回一个描述符号,描述符号占用8字节。根据语法来说,在MQL6中的描述符号目标中与C++程序类似。

示例:

MyObject* hobject= new MyObject();

相较于C++,上面示例的hobject变量并不是内存指针,而是一个对象描述符。 此外,MQL5中,必须通过引用传递函数参数的所有对象。下面是作为函数参数传递对象的示例:

class Foo
  {
public:
   string            m_name;
   int               m_id;
   static int        s_counter;
   //--- 构造函数和析构函数
                     Foo(void){Setup("noname");};
                     Foo(string name){Setup(name);};
                    ~Foo(void){};
   //--- 初始化 Foo类型对象
   void              Setup(string name)
     {
      m_name=name;
      s_counter++;
      m_id=s_counter;
     }
  };
int Foo::s_counter=0;
//+------------------------------------------------------------------+
//| 脚本程序开始函数                                                   |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- 声明一个自动创建的对象变量
   Foo foo1;
//--- 引用传递对象变量
   PrintObject(foo1);
 
//--- 声明对象指针,使用'new'操作符创建它
   Foo *foo2=new Foo("foo2");
//--- 引用传递对象指针的变量
   PrintObject(foo2); // 对象指针根据编译器自动转换
 
//--- 声明Foo类型对象的数组
   Foo foo_objects[5];
//--- 传递对象数组变量
   PrintObjectsArray(foo_objects); // 传递对象数组的单独函数
 
//--- 声明Foo类型对象的指针数组
   Foo *foo_pointers[5];
   for(int i=0;i<5;i++)
     {
      foo_pointers[i]=new Foo("foo_pointer");
     }
//--- 传递指针数组变量
   PrintPointersArray(foo_pointers); // 传递数组指针分隔函数
 
//--- 终止前强制删除创建为指针的对象
   delete(foo2);
//--- 删除指针数组
   int size=ArraySize(foo_pointers);
   for(int i=0;i<5;i++)
      delete(foo_pointers[i]);
//---   
  }
//+------------------------------------------------------------------+
//| 始终通过引用传递对象                                                |
//+------------------------------------------------------------------+
void PrintObject(Foo &object)
  {
   Print(__FUNCTION__,": ",object.m_id," Object name=",object.m_name);
  }
//+------------------------------------------------------------------+
//| 传递对象数组                                                       |
//+------------------------------------------------------------------+
void PrintObjectsArray(Foo &objects[])
  {
   int size=ArraySize(objects);
   for(int i=0;i<size;i++)
     {
      PrintObject(objects[i]);
     }
  }
//+------------------------------------------------------------------+
//| 传递对象指针数组                                                   |
//+------------------------------------------------------------------+
void PrintPointersArray(Foo* &objects[])
  {
   int size=ArraySize(objects);
   for(int i=0;i<size;i++)
     {
      PrintObject(objects[i]);
     }
  }
//+------------------------------------------------------------------+

另见

变量初始变量变量可见范围和使用期限创建和删除目标


更新: 2015.12.03