错误、漏洞、问题 - 页 1889

[删除]  

这是一个错误还是我错过了什么? 一个正常的抛物线EA会在前一个点放置一个止损单,在买入的情况下会考虑到点差。
而现在的价格(Ask)已经达到了订单价格57781,但订单却没有打开。

 
执行的错误 是什么?
class CLASS1
{
public:
  int i;  
};

class CLASS2 : public CLASS1 {};

void OnStart()
{
  CLASS1 Object;
  CLASS2* Ptr = dynamic_cast<CLASS2*>(&Object);
  
  Ptr.i = 1;
}
 
fxsaber:
什么是运行时错误

如果你这样做。

class CLASS1
{
public:
  int i;  
};

class CLASS2 : public CLASS1 {};

void OnStart()
{
  CLASS2 Object;
  CLASS1* Ptr = dynamic_cast<CLASS1*>(&Object);
  
  Ptr.i = 1;
}

即转换为父类型,那么一切都会正常进行,显然语言结构发生了非常重大的变化,现在派生类型绝对不是祖类型。

在C++上检查过。

class CLASS1
{
public:
  int i;  
};

class CLASS2 : public CLASS1 {};

void OnStart()
{
  CLASS1* Object = new CLASS1();
  CLASS2* Ptr = (CLASS2 *)&Object;
  
  Ptr->i = 1;
}

将一个父类的对象投到一个派生类中是正确处理的,也就是说,在MQL5机制中,在类型投递方面存在一个错误,除非它不是这样设计的。

[删除]  
fxsaber:
什么是执行错误

如果你不检查dynamic_cast返回的内容,使用它就没有意义。

 
Konstantin:

如果你这样做。

即转换为父类,那么一切都会正常进行,显然语言结构发生了非常重大的变化,现在派生类型毫不含糊地不是祖先类型。

在MQL中,如果没有dynamic_cast,父代铸造一直都可以工作--经典的做法。也许我没有理解dynamic_cast的含义。我也许不明白文档中的例子的意思。有人可以解释一下。
 
Koldun Zloy:

如果你不检查dynamic_cast返回的内容,那么使用它就没有意义。

谢谢,在我的例子中,它返回NULL。为什么会发生这种情况?

你能举个实际例子说明如何使用这一招吗?


开发人员只在Graphic.mqh中使用它,如下所示

      curve=dynamic_cast<CCurve*>(m_arr_curves.At(i));

      if(CheckPointer(curve)!=POINTER_DYNAMIC)
         return(false);

同时,他们有像这样的类/对象的定义

class CCurve : public CObject

CObject          *At(const int index) const;

也就是说,它们将一个父指针传递给一个子指针。嗯,这正是我在我的例子中所做的!障碍在哪里?

[删除]  

一个指向父类的指针实际上可以包含一个指向子类的指针。

class Class1
{
};

class Class2 : public Class1
{
};


Class1* a = new Class2();

Class2* b = dynamic_cast< Class2* >( a );

// b != NULL
 
Koldun Zloy:

一个指向父类的指针实际上可以包含一个指向子类的指针。

谢谢,知道了!
 
fxsaber:
谢谢你,我知道了!

我还是不明白为什么在MQL中,你不能把指针投到一个子类的指针类型上,而在C++中却可以,你能解释一下这是MQL的一个错误还是应该如此?

 
Konstantin:

这在C++中是可能的,你能解释一下这是否是MQL中的一个错误或应该是这样的吗?

在C++中,也只有当一个基类的指针指向一个子类时才有可能。