巴解组织。应用问题 - 页 11

 
Interesting:

能够读到的东西有多好?:)

这也是不错的方法,虽然据我所知,这两种方法都是为发送/读取一个参数而设计的(尽管是不同的类型)。

但是,当你有很多参数,而你又不能把所有的参数都放在一个基类中时,如何解决这个问题呢?

据我所知,你必须输入你要传递的参数的索引(你也可以在一个类中创建一个数组,按索引存储参数)?

我也不明白...

在我的例子中,有一个索引,只是它不是数字的明确形式,而是一个枚举....。

 

算了吧,这不值得。

 

Interesting:

耶德尔金

一般来说,在对问题进行讨论后,https://www.mql5.com/ru/forum/3566/page6#comment_58280,向员工代表发出申请。

1.我不知道,我不知道。

我不认为开发者会采取某些措施,为了安全而牺牲功能(一方面也是正确的)。

汇报情况。

该申请是这样的。
...

建议。

1.澄清 "多态性 "手册中的 "多态性 "部分,具体说明如何用CShape派生的类的实例正确填充数组形状[10](举例说明)。

2.检查字符串的书写是否正确。

CShape[10] shapes;                       // массив объектов CShape

3.解释一下在声明类时,是否要在被声明的类的名称后面紧紧地加上大括号。

class CShape{};

class CCircle{} :public CShape

class CSquare{} :public CShape

响应。

Rashid Umarov 2011.04.11 15:17

在撰写帮助的时候,有些地方还没有明确的文件。我们将修正这一点并添加正确的代码。谢谢你的留言。

帮助中会增加一个扩展的描述,这里是它的一个摘录。

我们假设我们的程序使用不同类型的对象(CCircle和CSquare),但从一个基本类型CShape继承。多态性允许我们创建一个基本类型为CShape的对象数组,但是当我们声明这个数组时,对象本身仍然是未知的,它们的类型是未定义的。

数组中的每个元素将包含哪种类型的对象,将在程序的执行过程中作出决定。这意味着要为相应的类动态创建对象,因此需要使用对象指针而不是对象本身。

为了动态地创建对象,要使用new操作符;每个这样的对象必须由delete操作符独立和明确地删除。因此,我们将声明一个CShape类型的指针数组,并为其每个元素(new_class_name) 创建一个所需类型的对象,如示例脚本所示。

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

//| Script program start function                                    |

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

void OnStart()

  {

//--- объявим массив указателей объектов базового типа 

   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_INVALID

      else

        {

         //--- сообщим об ошибке

         PrintFormat("Объект shapes[%d] не инициализирован! Его указатель %s",

                     i,EnumToString(CheckPointer(shapes[i])));

        }

     }



//--- мы должны самостоятельно уничтожить все созданные динамические объекты

   for(int i=0;i<total;i++)

     {

      //--- удалять можно только объекты, чей указатель имеет тип POINTER_DYNAMIC

      if(CheckPointer(shapes[i])==POINTER_DYNAMIC)

        {

         //--- сообщим об удалении

         PrintFormat("Удаляем shapes[%d]",i);

         //--- уничтожим объект по его указателю

         delete shapes[i];

        }

     }

  }


注意,当用删除操作符删除一个对象时,你应该检查其指针的类型。你只能删除指针为POINTER_DYNAMIC的对象,对于其他类型的指针,你会得到一个错误。

我认为这个例子完全涵盖了创建一个指针数组的想法。
Rashid Umarov 2011.04.11 10:31

谢谢你的帖子,我们已经纠正了№2和№3。将在新版本的帮助中出现



 

问题。标准库 使用以下几行

void CTrade::Request(MqlTradeRequest& request) const
  {...}

参考手册》说:"const 指定器不适用于结构和类的成员"。在上面的类方法中使用const 是什么意思,在这种情况下的使用规则是什么?

Документация по MQL5: Стандартная библиотека
Документация по MQL5: Стандартная библиотека
  • www.mql5.com
Стандартная библиотека - Документация по MQL5
 

Yedelkin:

...............

上述在类方法 中使用const 是什么意思,在这种情况下的使用规则是什么?

哦,是的,我也想了很久了。我想以有意义的方式使用这些语言,充分意识到 "游戏规则"。
 
Yedelkin:

问题。标准库 使用以下几行

参考手册》说:"const 指定器不适用于结构和类的成员"。在上面的类方法中使用const 是什么意思,在这种情况下的使用规则是什么?

结构/类成员是一回事,但方法是另一回事。

一个被描述为const的方法意味着它不会改变其类的状态/成员。也就是说,在调用这样一个方法后,类的内部状态保持不变。它被用来额外地告诉编译器检查改变类成员的企图。

 
Renat:

结构/类成员 是一回事,方法是另一回事。

一个被描述为const的方法意味着它不会改变其类的状态/成员。也就是说,这个方法被调用后,类的内部状态保持不变。它被用来额外地告诉编译器检查改变类成员的企图。

哇。谢谢你!于是我绞尽脑汁。

 
TheXpert:
顺便说一下,在我们讨论这个问题的时候,有一个合乎逻辑的问题 -- 没有手册,也不指望它?

它可以如何使用?因为线程之间并不相互影响。

如果数据可以在线程之间自由传输,那么,是的,就需要有这样的指令了。

 
该死,我以为我写错了什么 :) 现在我知道是什么了。当然不是易变的--易变的:))
 
class COracleTemplate
  {
private:
public:
   string            filename;
                     COracleTemplate(){Init();};
                    ~COracleTemplate(){DeInit();};
   virtual void      Init(){filename=this.Name();Print("loadSettings from ",filename);};
   virtual void      DeInit(){Print("saveSettings to ",filename);};
   virtual string    Name(){return("Prpototype");};
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CCO2:public COracleTemplate
  {
   virtual string    Name(){return("CO2");};
  };
class CH2O:public COracleTemplate
  {
   virtual string    Name(){return("H2O");};
  };
COracleTemplate* CO2,*H2O;
void OnStart()
  {
   CO2=new CCO2;
   Print(CO2.Name()," filename=",CO2.filename);
   delete CO2;
   
   H2O=new CH2O;
   Print(H2O.Name()," filename=",H2O.filename);
   delete H2O;
   
  }

下午好。

这样的问题

关于上面的代码

我做错了什么,还是在MT5中普遍无法实现?

我想(我认为这是显而易见的)--在文件名变量中获得重写的名字......

原因: