在MQL4编程中,我们可以动态地创建复杂类型的对象。这是通过new操作符完成的,它返回创建的对象的描述符。描述符占用8字节的空间。在语法上,MQL4中的对象描述符类似于C++中的指针。
示例:
MyObject* hobject= new MyObject();
与C++不同,上述示例中的hobject变量并非内存指针,而是对象描述符。此外,在MQL5中,函数参数中的所有对象都必须通过引用传递。下面是将对象作为函数参数传递的示例:
class MyClass
{
public:
string m_name;
int m_id;
static int s_counter;
MyClass(void){Setup("noname");};
MyClass(string name){Setup(name);};
~MyClass(void){};
void Setup(string name)
{
m_name=name;
s_counter++;
m_id=s_counter;
}
};
int MyClass::s_counter=0;
void OnStart()
{
MyClass class1;
PrintObject(class1);
MyClass *class2=new MyClass("class2");
PrintObject(class2);
MyClass class_objects[5];
PrintObjectsArray(class_objects);
MyClass *class_pointers[5];
for(int i=0;i<5;i++)
{
class_pointers[i]=new MyClass("class_pointer");
}
PrintPointersArray(class_pointers);
delete(class2);
int size=ArraySize(class_pointers);
for(int i=0;i<5;i++)
delete(class_pointers[i]);
}
void PrintObject(MyClass &object)
{
Print(__FUNCTION__,": ",object.m_id," Object name=",object.m_name);
}
void PrintObjectsArray(MyClass &objects[])
{
int size=ArraySize(objects);
for(int i=0;i<size;i++)
{
PrintObject(objects[i]);
}
}
void PrintPointersArray(MyClass* &objects[])
{
int size=ArraySize(objects);
for(int i=0;i<size;i++)
{
PrintObject(objects[i]);
}
}
在这个例子中,我们首先创建了一个名为MyClass的类,并定义了类的构造函数、析构函数和成员函数。然后我们在OnStart函数中创建了多种不同类型的MyClass对象,包括单个对象、对象数组和对象指针数组,并通过PrintObject、PrintObjectsArray和PrintPointersArray函数打印了这些对象的信息。最后,我们删除了通过new操作符创建的对象,以防止内存泄漏。