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

 

技术参考。在处理类的时候,有一个 "包装机制 "的例子(这样你就不必去寻找它了)。

https://www.mql5.com/ru/forum/3555/page3#comment_57315

Ограничение кеша индикатора.
Ограничение кеша индикатора.
  • www.mql5.com
Но вот нет никакой возможности ограничить автоматическую загрузку данных в кеш индикатора.
 

问题。新的运营商。参考手册》中说new是一个操作符;但是在例子中,在使用这个操作符后往往要进行检查,以确保它等于NULL。比如说。

//+------------------------------------------------------------------+
//| Создание фигуры                                                  |
//+------------------------------------------------------------------+
void CTetrisField::NewShape()
  {
   m_ypos=HORZ_BORDER;
//--- случайным образом создаём одну из 7 возможных фигур
   int nshape=rand()%7;
   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;
     }
//--- отрисовываем
   if(m_shape!=NULL)
     {
      //--- начальные установки
      m_shape.SetRightBorder(WIDTH_IN_PIXELS+VERT_BORDER);
      m_shape.SetYPos(m_ypos);
      m_shape.SetXPos(VERT_BORDER+SHAPE_SIZE*8);
      //--- отрисуем
      m_shape.Draw();
     }
//---
  }

也有人说,"NULL 可以与使用new操作符创建的对象的指针相比较"。

因此,事实证明,新操作符并不总是创建一个新对象?或者说,检查创建的对象 是否与NULL相等是开发者风格的一个特点,并不是必须的?

 
Yedelkin:

问题。新的运营商。参考手册》中说new是一个操作符;但是在例子中,在使用这个操作符后往往要进行检查,使其等于NULL。比如说。

也有人说,"NULL 可以与使用new操作符创建的对象的指针相比较"。

因此,事实证明,新操作符并不总是创建一个新对象?或者说,检查创建的对象 是否与NULL相等是开发者风格的一个特点,并不是必须的?

如果你在程序的一个地方创建了一个动态对象,那么在另一个地方销毁它也是合乎逻辑的,而且这一切都在一个函数内,并不是一个事实,因此有一个简单的经验法则,在使用指针之前要检查它是否存在。
 
Urain:
如果你在程序中的一个地方创建了一个动态对象,那么合乎逻辑的是你会在另一个地方销毁它,而且不确定这一切是否在一个函数内,所以一个简单的规则是在使用 指针之前检查它是否存在。

这一点是正确的。但在《参考手册》的例子中,检查是 对象被创建后立即 进行的,即在程序中的一个地方和一个函数内。而这里给出的规则也不太符合要求。为什么要在创建一个对象后立即进行检查?因此,事实证明,新操作符并不总是创建一个新对象?=(我重复)=

这里是众多例子中的另一个。

//--- example for CArrayString::Add(string)
#include <Arrays\ArrayString.mqh>
//---
void OnStart()
  {
   CArrayString *array=new CArrayString;
   //---
   if(array==NULL)
     {
      printf("Object create error");
      return;
     } 
 
Yedelkin:

这一点是正确的。但在《参考手册》的例子中,检查是 对象被创建后立即 进行的,即在程序的一个地方和一个函数中进行。而上述规则在这里并不适用。为什么要在对象被创建后立即进行检查?所以事实证明,新运算符并不总是创建一个新对象(我重复一遍)?

这里是众多例子中的另一个。

有这种可能性。在帮助 中,第一段。
 
Lizar:
有这样一种可能性。在参考文献中,第一段。
好的。事实证明,操作员的行为就像一个函数。它可能会也可能不会创造它。
 
Yedelkin:
好的。事实证明,操作者的行为是一个函数的行为。它可能被创造,也可能不被创造。
例如,没有足够的内存给该对象。
 
Rosh:
例如,没有足够的内存给一个对象。
有时一个简单的解释有助于大大拓宽你的视野。谢谢你!
 

问题。在父类中声明了具有一定参数和类型的虚函数 后,是否可以在子类中改变相应虚函数的参数数量和类型?

一方面,《参考手册》指出,"一个虚拟函数可以在派生类中被替换 为虚拟函数调用哪个 函数定义 选择 动态的(在运行时)一个典型的情况是当一个基类包含和派生类有他们自己的该函数的版本时"。另一方面,《参考手册》中给出的例子是指虚拟函数具有不同的函数定义体而 不是函数定义 的情况。

 
Yedelkin:

问题。在父类中声明了具有一定参数及其类型的虚函数 后,是否可以在子类中改变相应虚函数的参数数量和类型?

只有定义的精确拷贝,除了默认参数(默认值可能不同,但最好不要使用这个)。