//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
//--- объявим массив указателей объектов базового типа
CShape *shapes[5]; // массив указателей на объекты CShape//--- здесь заполняем массив производными объектами//--- объявим указатель на объект типа CCircle
CCircle *circle=new CCircle();
//--- задаем свойства объекта по указателю circle
circle.SetRadius(2.5);
//--- поместим в shapes[0] значение указателя
shapes[0]=circle;
//--- создаем еще один объект CCircle и запишем его указатель в shapes[1]
circle=new CCircle();
shapes[1]=circle;
circle.SetRadius(5);
//--- тут мы намеренно "забыли" задать значение для shapes[2]//circle=new CCircle();//circle.SetRadius(10);//shapes[2]=circle;//--- для неиспользуемого элемента установим значение NULL
shapes[2]=NULL;
//--- создаем объект CSquare и запишем его указатель в shapes[3]
CSquare *square=new CSquare();
square.SetSide(5);
shapes[3]=square;
//--- создаем объект CSquare и запишем его указатель в shapes[4]
square=new CSquare();
square.SetSide(10);
shapes[4]=square;
//--- массив указателей есть, получим его размерint total=ArraySize(shapes);
//--- пройдем в цикле по всем указателям в массиве for(int i=0; i<5;i++)
{
//--- если по указанному индексу указатель является валиднымif(CheckPointer(shapes[i])!=POINTER_INVALID)
{
//--- выведем в лог тип и площадь фигурыPrintFormat("Объект типа %d имеет площадь %G",
shapes[i].GetType(),
shapes[i].GetArea());
}
//--- если указатель имеет тип POINTER_INVALIDelse
{
//--- сообщим об ошибкеPrintFormat("Объект shapes[%d] не инициализирован! Его указатель %s",
i,EnumToString(CheckPointer(shapes[i])));
}
}
//--- мы должны самостоятельно уничтожить все созданные динамические объектыfor(int i=0;i<total;i++)
{
//--- удалять можно только объекты, чей указатель имеет тип POINTER_DYNAMICif(CheckPointer(shapes[i])==POINTER_DYNAMIC)
{
//--- сообщим об удаленииPrintFormat("Удаляем shapes[%d]",i);
//--- уничтожим объект по его указателюdelete shapes[i];
}
}
}
能够读到的东西有多好?:)
这也是不错的方法,虽然据我所知,这两种方法都是为发送/读取一个参数而设计的(尽管是不同的类型)。
但是,当你有很多参数,而你又不能把所有的参数都放在一个基类中时,如何解决这个问题呢?
据我所知,你必须输入你要传递的参数的索引(你也可以在一个类中创建一个数组,按索引存储参数)?
我也不明白...
在我的例子中,有一个索引,只是它不是数字的明确形式,而是一个枚举....。
算了吧,这不值得。
Interesting:
一般来说,在对问题进行讨论后,https://www.mql5.com/ru/forum/3566/page6#comment_58280,向员工代表发出申请。
1.我不知道,我不知道。
我不认为开发者会采取某些措施,为了安全而牺牲功能(一方面也是正确的)。
汇报情况。
该申请是这样的。建议。
1.澄清 "多态性 "手册中的 "多态性 "部分,具体说明如何用CShape派生的类的实例正确填充数组形状[10](举例说明)。
2.检查字符串的书写是否正确。
3.解释一下在声明类时,是否要在被声明的类的名称后面紧紧地加上大括号。
class CShape{};
class CCircle{} :public CShape
class CSquare{} :public CShape
响应。
帮助中会增加一个扩展的描述,这里是它的一个摘录。
我们假设我们的程序使用不同类型的对象(CCircle和CSquare),但从一个基本类型CShape继承。多态性允许我们创建一个基本类型为CShape的对象数组,但是当我们声明这个数组时,对象本身仍然是未知的,它们的类型是未定义的。
数组中的每个元素将包含哪种类型的对象,将在程序的执行过程中作出决定。这意味着要为相应的类动态创建对象,因此需要使用对象指针而不是对象本身。
为了动态地创建对象,要使用new操作符;每个这样的对象必须由delete操作符独立和明确地删除。因此,我们将声明一个CShape类型的指针数组,并为其每个元素(new_class_name) 创建一个所需类型的对象,如示例脚本所示。
注意,当用删除操作符删除一个对象时,你应该检查其指针的类型。你只能删除指针为POINTER_DYNAMIC的对象,对于其他类型的指针,你会得到一个错误。
谢谢你的帖子,我们已经纠正了№2和№3。将在新版本的帮助中出现
问题。标准库 使用以下几行
参考手册》说:"const 指定器不适用于结构和类的成员"。在上面的类方法中使用const 是什么意思,在这种情况下的使用规则是什么?
Yedelkin:
...............
上述在类方法 中使用const 是什么意思,在这种情况下的使用规则是什么?
问题。标准库 使用以下几行
参考手册》说:"const 指定器不适用于结构和类的成员"。在上面的类方法中使用const 是什么意思,在这种情况下的使用规则是什么?
结构/类成员是一回事,但方法是另一回事。
一个被描述为const的方法意味着它不会改变其类的状态/成员。也就是说,在调用这样一个方法后,类的内部状态保持不变。它被用来额外地告诉编译器检查改变类成员的企图。
结构/类成员 是一回事,方法是另一回事。
一个被描述为const的方法意味着它不会改变其类的状态/成员。也就是说,这个方法被调用后,类的内部状态保持不变。它被用来额外地告诉编译器检查改变类成员的企图。
哇。谢谢你!于是我绞尽脑汁。
顺便说一下,在我们讨论这个问题的时候,有一个合乎逻辑的问题 -- 没有手册,也不指望它?
它可以如何使用?因为线程之间并不相互影响。
如果数据可以在线程之间自由传输,那么,是的,就需要有这样的指令了。
下午好。
这样的问题
关于上面的代码
我做错了什么,还是在MT5中普遍无法实现?
我想(我认为这是显而易见的)--在文件名变量中获得重写的名字......