巴解组织。应用问题 - 页 7 1234567891011121314...19 新评论 Yedelkin 2011.04.09 20:51 #61 equivalent23:当然了。 我意识到,问题在于如何用从CShape 派生的类的实例正确 填充 shapes[10]数组。我建议的选项由于某种原因而不能工作。让我们想想。 Aleksandr Chugunov 2011.04.09 21:15 #62 Yedelkin: 我意识到,问题在于如何用从CShape 派生的类的实例正确 填充数组shapes[10]。我建议的变体由于某种原因不能工作。让我们想想。数组必须是类指针类型的,而不是类类型本身。然后我们可以应用新的运算符。 Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new www.mql5.com Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5 equivalent23 2011.04.09 21:21 #63 AlexSTAL:数组必须是类指针类型的,而不是类本身的。然后你可以应用新的运算符。我可以给你举个例子吗?只是我所举的例子是从文件中提取的,并不清楚它应该如何工作... [删除] 2011.04.09 21:36 #64 Yedelkin: 我意识到,问题在于如何用从CShape 派生的类的实例正确 填充数组shapes[10]。我建议的变体由于某种原因不能工作。让我们想想。不管你想不想,100卢布都不是钱。这个例子是百分之百的小毛病,这样的实现要么没有经过深思熟虑,要么没有完成。我不会引用我自己在代码中的实验结果,我只给你结论。1.如果你不把对象作为类来声明,而是作为结构来声明,它们将很容易被放入数组。但病毒性将不得不被移除,你只能用数组所具有的对象类型(在这种情况下,是基类)的功能来工作。2.2.你可以把它们声明为指针,然后你就可以形成一个数组。a) 如果指针没有被清除,就会发生内存泄漏。b) 你也不能正常使用子代功能。PS更确切地说,在基类中声明的功能是可用的,在子类中也是可见的,但在子类中出现的所有功能是不可用的。 Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов www.mql5.com Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов - Документация по MQL5 Yedelkin 2011.04.09 21:36 #65 AlexSTAL: 数组的类型必须是指向类的指针,而不是类本身的类型。 然后你可以应用新的运算符。 是的,我也朝这个方向想过,关于使用指针。但这样一来,文件中的条件就没有得到满足。 "对于一个正方形(CSquare类),面积是通过边来计算的,对于一个圆(CCircle类),面积是通过半径来表示的,以此类推。我们可以创建一个数组来存储 CShape类型的对象 ,在这个数组中我们既可以存储基类的对象,也可以存储它的所有子类。以后我们可以对这个数组的任何元素调用同样的函数。 ...由于我们需要m_radius和m_square_side成员的相应值来计算正方形和圆形的面积,我们在相应的类的声明中加入了SetRadius和SetSide()函数。现在我们可以 声明一个Shape类型的数组,用 派生类的 对象填充它 ......" [删除] 2011.04.09 21:36 #66 AlexSTAL:数组的类型必须是指向类的指针,而不是类本身的类型。然后你可以应用新的运算符。 它不会正常工作。虽然它将形成一个阵列。耶德尔金。...由于计算正方形和圆形的面积需要m_radius和m_square_side成员的相应值,我们在相应类的声明中加入了SetRadius和SetSide()函数。现在我们可以声明一个Shape类型的数组,用派生类的对象来填充它..."整个事情是,如果数组是基类类型的,就不能访问其后代功能,即SetRadius()和SetSide()变得不可用。这就是为什么我可以看到三种选择。1. 阵列应该是同质的(如果可能)。2.我对MQL5的OOP理念和架构有些不理解。3.要么是开发者没能实现这个例子,要么是他们没能贯彻这个问题。 Aleksandr Chugunov 2011.04.09 21:38 #67 Interesting: 它不会正常工作。不过,它将形成一个阵列。 你说它不能工作是什么意思? Yedelkin 2011.04.09 21:39 #68 Interesting: 更确切地说,在基类中声明的功能是可用的,同时它在子类中也是可见的,但在子类中出现的所有功能都是不可 用的。 是的,这正是我遇到的情况。 有趣的 是。 这个例子是百分之百的故障......。 事实证明,我们需要《手册》作者对这个问题做出回答。 Aleksandr Chugunov 2011.04.09 21:48 #69 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; } [删除] 2011.04.09 21:48 #70 AlexSTAL: 你说它不能正常工作是什么意思?1.后裔功能不可用。我不知道是谁或如何做到的,但就我个人而言,我从来没有从数组中获得SetRadius()和SetSide()的权限。也许有办法用autogenous解决这个问题,但我想不用它。2.也许我对指针的处理是错误的,但我要么一直有泄漏,要么必须在主要工作的区块中直接打出指针。 1234567891011121314...19 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
当然了。
我意识到,问题在于如何用从CShape 派生的类的实例正确 填充数组shapes[10]。我建议的变体由于某种原因不能工作。让我们想想。
数组必须是类指针类型的,而不是类类型本身。
然后我们可以应用新的运算符。
数组必须是类指针类型的,而不是类本身的。
然后你可以应用新的运算符。
我可以给你举个例子吗?
只是我所举的例子是从文件中提取的,并不清楚它应该如何工作...
我意识到,问题在于如何用从CShape 派生的类的实例正确 填充数组shapes[10]。我建议的变体由于某种原因不能工作。让我们想想。
不管你想不想,100卢布都不是钱。
这个例子是百分之百的小毛病,这样的实现要么没有经过深思熟虑,要么没有完成。
我不会引用我自己在代码中的实验结果,我只给你结论。
1.如果你不把对象作为类来声明,而是作为结构来声明,它们将很容易被放入数组。但病毒性将不得不被移除,你只能用数组所具有的对象类型(在这种情况下,是基类)的功能来工作。
2.2.你可以把它们声明为指针,然后你就可以形成一个数组。
a) 如果指针没有被清除,就会发生内存泄漏。
b) 你也不能正常使用子代功能。
PS
更确切地说,在基类中声明的功能是可用的,在子类中也是可见的,但在子类中出现的所有功能是不可用的。
数组的类型必须是指向类的指针,而不是类本身的类型。
然后你可以应用新的运算符。
是的,我也朝这个方向想过,关于使用指针。但这样一来,文件中的条件就没有得到满足。
"对于一个正方形(CSquare类),面积是通过边来计算的,对于一个圆(CCircle类),面积是通过半径来表示的,以此类推。我们可以创建一个数组来存储 CShape类型的对象 ,在这个数组中我们既可以存储基类的对象,也可以存储它的所有子类。以后我们可以对这个数组的任何元素调用同样的函数。
...由于我们需要m_radius和m_square_side成员的相应值来计算正方形和圆形的面积,我们在相应的类的声明中加入了SetRadius和SetSide()函数。现在我们可以 声明一个Shape类型的数组,用 派生类的 对象填充它 ......"
数组的类型必须是指向类的指针,而不是类本身的类型。
然后你可以应用新的运算符。
耶德尔金。
...由于计算正方形和圆形的面积需要m_radius和m_square_side成员的相应值,我们在相应类的声明中加入了SetRadius和SetSide()函数。现在我们可以声明一个Shape类型的数组,用派生类的对象来填充它..."
整个事情是,如果数组是基类类型的,就不能访问其后代功能,即SetRadius()和SetSide()变得不可用。
这就是为什么我可以看到三种选择。
1. 阵列应该是同质的(如果可能)。
2.我对MQL5的OOP理念和架构有些不理解。
3.要么是开发者没能实现这个例子,要么是他们没能贯彻这个问题。
它不会正常工作。不过,它将形成一个阵列。
更确切地说,在基类中声明的功能是可用的,同时它在子类中也是可见的,但在子类中出现的所有功能都是不可 用的。
是的,这正是我遇到的情况。
这个例子是百分之百的故障......。
事实证明,我们需要《手册》作者对这个问题做出回答。
它不会正常工作。不过,它将形成一个阵列。
诀窍在于,如果数组是基类类型的,就不能访问其后代功能,即SetRadius()和SetSide()变得不可用。
这就是为什么我可以看到三种选择。
1. 阵列应该是同质的(如果可能)。
2.我对MQL5的OOP理念和架构有些不理解。
3.开发者要么背叛了一个不起作用的例子,要么他们还没有完成任务。
执行。
你可以做更简单的事情...虚拟化。
你说它不能正常工作是什么意思?
1.后裔功能不可用。我不知道是谁或如何做到的,但就我个人而言,我从来没有从数组中获得SetRadius()和SetSide()的权限。也许有办法用autogenous解决这个问题,但我想不用它。
2.也许我对指针的处理是错误的,但我要么一直有泄漏,要么必须在主要工作的区块中直接打出指针。