错误、漏洞、问题 - 页 453

 
Interesting:

不要创建动态对象--你将不必使用现在和与这些对象有关的其他一切(但那样你将无法做很多事情)。

你想了解的不是现在的意义,而是与动态对象一起工作的意义......。

//////////////////////////////////////// 跟随我的文字(我无法摆脱引用):) //////////////////////////////////////////////////////////////

空白的OnStart()
{
//---
初步了解。
obekt.f1()。
}
//+------------------------------------------------------------------+
阶级入门
{
公众。
void f1();

primer()。
};

primer::primer()
{
Alert("我认为这里的初始化也只是在创建的时候")。
};

引子::f1()
{
int l[]。
ArrayResize(l,3)。
l[0]=87;
l[1]=67;
l[2]=57;
ArrayResize(l,5)。
l[3]=47;
l[4]=37;
Alert(l[0]," ",l[1]," ",l[2]," ",l[3]," ",l[4]) 。
};

这段代码没有产生错误,而且数组是动态的。为什么????

而如果你想摧毁它。

{

obekt。
obekt.f1()。


}

似乎他们把C++的地址处理搞得一团糟,然后把它放到了MQL中。

 

220Volt:

这是我的文字(我无法摆脱引用):)

这段代码没有出现错误,而且数组是动态的。为什么????

1.为什么要在执行时出现错误?

a) 该对象被自动创建(这是由OnStart中声明对象实例的方法引起的),并被自动删除

primer  obekt1;   //Конструктор будет вызван автоматически уже на этой строчке
 primer *obekt2; //Указатель на динамический объект

void OnStart()
{
obekt2 = new primer; //Конструктор выполняется вот тут 

obekt.f1();

delete(obekt2); //Тут выполняется деструктор (отсутствие delete приведет к утечки памяти в момент завершения работы скрипта)
}

至于对象,其实例可以自动或动态地创建。在第一种情况下,构造函数通常在初始化时执行,在第二种情况下,它在使用new 操作符后执行。

b) 从逻辑上讲,f1()中也不应该有错误(尽管我个人会以不同的方式实现它)。

至于动态数组。它们与静态数组的不同之处在于,这样的数组没有已知的维度,这意味着在你处理这样的数组之前,你应该用ArrayResize 来指定它(你应该在数组的第一个维度上 指定一个新的大小)。需要注意的是,数组元素的编号是从0开始的。

2.如果你对动态对象的工作感兴趣,请仔细研究这个例子--俄罗斯方块(虽然我在老论坛上仍然无法理解它的作用)...

 

我很抱歉打扰你,我只是真的想弄清楚这件事的真相。我来告诉你我错在哪里。

如果我们看一下C++的符号(我们有一个声明的底层类)

引子 *ukazatel=新引子。

说,ukazatel包含内存中的地址,我们的对象,即底层类的一个副本,被存储在那里。从MQL地址被删除,而ukazatel包含一个对象描述符。我们能从中得到什么?我注意到的唯一区别是,如果我们在程序块中通过新的对象进行声明,并且在完成程序块之前忘记使用delete,那么该对象将在程序完成后才被删除。而在退出区块后,通过句柄与该对象的连接将被丢失。

我曾想过,如果通过new声明,那么该对象的内存是动态分配的(即可以增加其大小),如果没有new,那么该对象只能有静态变量。但我的假设没有得到证实(我之前发布的脚本,对象不是通过new声明的,而是处理了一个动态变量)。

而在所有这些激情之后,我处于一个不太好的境地,我不明白有新的或没有新的有什么区别,如果编译器本身修复了那里的东西,我为什么要麻烦呢?

Документация по MQL5: Основы языка / Переменные / Статические переменные
Документация по MQL5: Основы языка / Переменные / Статические переменные
  • www.mql5.com
Основы языка / Переменные / Статические переменные - Документация по MQL5
 

甚至试图做一些像文件中描述的事情(找出一些新的东西)。

switch(5)

{

案例5:m_shape=new CTetrisShape1; //这个选项根本不起作用(这是来自于文档的内容! !)。!!!)只有这种方式

( m_shape=new CTetrisShape1; )

}

而现在我们不能访问m_shape.___对象,将显示一个错误

 

220Volt:

而现在我发现自己在经历了这些激情之后,处境不是很好,我不明白有新的或没有新的有什么区别,如果编译器修复了那里的东西,我为什么还要去打扰呢?

对象实例是使用new if操作符动态创建的(这就是为什么我要求看俄罗斯方块的例子)。

1.对象实例的数量事先是不知道的(但假定总是有一个以上的实例)。

2.如果人们想创建一个指向 "异质 "对象的指针数组,这些对象有相同的祖先。

3.如果这个对象(或者说这个对象的一个指针)将被用作一个过程或函数的参数(你可能应该把它传递给库)。

4.如果打算在程序的不同部分用一个对象(读作:这个对象的指针)来工作。例如,同一个对象 "订单 "可以在:专家顾问创建的订单阵列;某个符号的订单阵列;形成某个位置的订单阵列,等等。

5.还有很多任务是通过应用动态创建的誓约和指针来解决的。

 
220Volt:

甚至试图做一些像文件中描述的事情(找出一些新的东西)。

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

而现在我们不能访问m_shape.___对象,将抛出一个错误

实际上,在俄罗斯方块的例子中,它是以如下方式实现的(注意在你的例子中缺少断裂运算符)。

   switch(nshape)
     {
      case 0: m_shape=new CTetrisShape1; break;
      case 1: m_shape=new CTetrisShape2; break;
      case 2: m_shape=new CTetrisShape3; break;
      case 3: m_shape=new CTetrisShape4; break;
      case 4: m_shape=new CTetrisShape5; break;
      case 5: m_shape=new CTetrisShape6; break;
      case 6: m_shape=new CTetrisShape7; break;
     }

不要忘记检查指针是否为NULL

 if(m_shape!=NULL)
 {
//С указателем можно работать
 }
 

有趣 的是,谢谢你的帮助
 

开发人员。

在文档中,请 "明确 "说明所有在测试器中不工作的东西,或与某些功能一起工作的东西(这样就不会出现不必要的问题)。

例如,你应该明确提到当地时间 和GMT时间(等同于服务器时间)的特殊性,以及TimeGMTOffset的问题性,以获得预期的结果。

 

谁知道 -- 是否有一种正常的方法可以将Unicode字符阵列翻译成字符串?

 
TheXpert:

谁知道 -- 是否有一种正常的方法可以将Unicode字符阵列翻译成字符串?

在我看来,我必须对数组的 每个元素 进行单独翻译。
Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Основы языка / Переменные - Документация по MQL5