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

 
equivalent23:

当然了。

我意识到,问题在于如何用从CShape 派生的类的实例正确 填充 shapes[10]数组我建议的选项由于某种原因而不能工作。让我们想想。
 
Yedelkin:
我意识到,问题在于如何用从CShape 派生的类的实例正确 填充数组shapes[10]。我建议的变体由于某种原因不能工作。让我们想想。

数组必须是类指针类型的,而不是类类型本身。

然后我们可以应用新的运算符

Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5
 
AlexSTAL:

数组必须是类指针类型的,而不是类本身的。

然后你可以应用新的运算符

我可以给你举个例子吗?

只是我所举的例子是从文件中提取的,并不清楚它应该如何工作...

 
Yedelkin:
我意识到,问题在于如何用从CShape 派生的类的实例正确 填充数组shapes[10]。我建议的变体由于某种原因不能工作。让我们想想。

不管你想不想,100卢布都不是钱。

这个例子是百分之百的小毛病,这样的实现要么没有经过深思熟虑,要么没有完成。

我不会引用我自己在代码中的实验结果,我只给你结论。

1.如果你不把对象作为类来声明,而是作为结构来声明,它们将很容易被放入数组。但病毒性将不得不被移除,你只能用数组所具有的对象类型(在这种情况下,是基类)的功能来工作。

2.2.你可以把它们声明为指针,然后你就可以形成一个数组。

a) 如果指针没有被清除,就会发生内存泄漏。

b) 你也不能正常使用子代功能。

PS

更确切地说,在基类中声明的功能是可用的,在子类中也是可见的,但在子类中出现的所有功能是不可用的。

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов - Документация по MQL5
 
AlexSTAL:

数组的类型必须是指向类的指针,而不是类本身的类型。

然后你可以应用新的运算符

是的,我也朝这个方向想过,关于使用指针。但这样一来,文件中的条件就没有得到满足。

"对于一个正方形(CSquare类),面积是通过边来计算的,对于一个圆(CCircle类),面积是通过半径来表示的,以此类推我们可以创建一个数组来存储 CShape类型的对象 ,在这个数组中我们既可以存储基类的对象,也可以存储它的所有子类。以后我们可以对这个数组的任何元素调用同样的函数。

...由于我们需要m_radius和m_square_side成员的相应值来计算正方形和圆形的面积,我们在相应的类的声明中加入了SetRadius和SetSide()函数。现在我们可以 声明一个Shape类型的数组,用 派生类的 对象填充它 ......"

 
AlexSTAL:

数组的类型必须是指向类的指针,而不是类本身的类型。

然后你可以应用新的运算符

它不会正常工作。虽然它将形成一个阵列。

耶德尔金

...由于计算正方形和圆形的面积需要m_radius和m_square_side成员的相应值,我们在相应类的声明中加入了SetRadius和SetSide()函数。现在我们可以声明一个Shape类型的数组,用派生类的对象来填充它..."

整个事情是,如果数组是基类类型的,就不能访问其后代功能,即SetRadius()和SetSide()变得不可用。

这就是为什么我可以看到三种选择。

1. 阵列应该是同质的(如果可能)。

2.我对MQL5的OOP理念和架构有些不理解。

3.要么是开发者没能实现这个例子,要么是他们没能贯彻这个问题。

 
Interesting:
它不会正常工作。不过,它将形成一个阵列。
你说它不能工作是什么意思?
 
Interesting:

更确切地说,在基类中声明的功能是可用的,同时它在子类中也是可见的,但在子类中出现的所有功能都是不可 用的。

是的,这正是我遇到的情况。

有趣的 是。

这个例子是百分之百的故障......。

事实证明,我们需要《手册》作者对这个问题做出回答。

 
Interesting:
它不会正常工作。不过,它将形成一个阵列。

诀窍在于,如果数组是基类类型的,就不能访问其后代功能,即SetRadius()和SetSide()变得不可用。

这就是为什么我可以看到三种选择。

1. 阵列应该是同质的(如果可能)。

2.我对MQL5的OOP理念和架构有些不理解。

3.开发者要么背叛了一个不起作用的例子,要么他们还没有完成任务。

执行。

class CBase
  {
public:
   void m_radius() {Print("CBase");}
  };

class CTest : public CBase
  {
public:
   void m_radius() {Print("CTest");}
  };

CBase* Base;

void OnStart()
  {
   Base = new CTest;
   Base.m_radius();
   ((CTest *)Base).m_radius();
   delete Base;
  }

你可以做更简单的事情...虚拟化。

class CBase
  {
public:
   virtual void m_radius() {Print("CBase");}
  };

class CTest : public CBase
  {
public:
   virtual void m_radius() {Print("CTest");}
  };

CBase* Base;

void OnStart()
  {
   Base = new CTest;
   Base.m_radius();
   delete Base;
  }
 
AlexSTAL:
你说它不能正常工作是什么意思?

1.后裔功能不可用。我不知道是谁或如何做到的,但就我个人而言,我从来没有从数组中获得SetRadius()和SetSide()的权限。也许有办法用autogenous解决这个问题,但我想不用它。

2.也许我对指针的处理是错误的,但我要么一直有泄漏,要么必须在主要工作的区块中直接打出指针。