错误、漏洞、问题 - 页 2359

 
A100:

我特别为你仔细检查了一下,考虑到

没关系的,DJ。

你使用什么编译器?

我在VS 2010上。

二进制'=':没有找到接收'A'类型右侧操作数的运算符(或者没有可接受的转换)。

p.s. 我真的不明白 "考虑到 "是什么意思?这是关于将基类隐式复制到派生类中的可接受性。

 

在Visual Studio中,我的例子 也能工作。我指的是明确的复制操作符,并通过代码解释了它。

我写这个是为了以防万一,这样如果你禁用了明确的那个,你就不会同时意外地禁用它了

 
A100:

在Visual Studio中,我的例子 也能工作。我指的是明确的复制操作符,并通过代码解释了它。

我指的不是显性运算符。 我说的是在这种情况下不允许隐性运算符,你称之为 "心胸狭窄",事实并非如此。

如果你需要进行复制,你必须先在C++中明确地将b投到正确的类型。因为这样的复制是对对象封装的一种违反。这就是为什么它不应该是关于暗示的。

 
A100:

我的意思是一个显式的复制操作符,并在代码中解释了它。

顺便说一下,如果类A也继承自某个类X,那么你的类B就不会受到保护,不会复制X(我们正在谈论MQL)。 你必须为所有的父类编写操作符。
 
A100:

我怀疑编译器将它们(在代码上下文中)分为显性和隐性。否则就很容易修复它

重点是隐式运算符总是与对象的类型相对应,即如果一个对象是B类型,它的隐式运算符是const B&类型,它不接受A类型,但这是C++。
 

顺便说一下,操作者的类型似乎是确定的

首先它寻找运算符B::,如果它不存在,然后它寻找运算符A::,如果它也不存在,那么它认为它的职责已经完成,什么也不做(尽管指针因此而被破坏):)

 
Ilya Malev:

如果它也不在那里,那么它就认为它的职责已经完成,什么也不做(尽管指针最终会被破坏) :)

为什么它不做任何事情?它通过隐式(自动)operator=(const A&)进行复制,这是不应该做的。

最后把B后面的星号去掉,它伤害了你的眼睛)我们已经弄清了这个错误的一切。

 
Alexey Navoykov:

最后把B后面的星号拿掉,它很伤眼)它已经用这个错误想出了一切。

我个人认为没有星号的对象变量令人不安 ))其中一个讨厌的bug是写A a=new A而不是*a,而且很长时间都不明白哪里出了问题)我则相反,表明如果你听从你的建议,声明一个私有的op.=&,一切都能正常工作。在这种情况下,编辑器会立即产生一个错误。从现在起我就这样做了 ))

 
花了几个小时寻找差异。发现这个
#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{
  const double Koef =  0.25;
  const int iDelta = 32;
  const double point = 0.00001;
  
  const double high = 1.06736;
  const double low = 1.06676;
  
  const double Avg = (high + low) * 0.5;  
  const double Size = (high - low) * Koef * 0.5;  
  
  PRINT(DoubleToString(Avg - Size - point * iDelta, 5));   // DoubleToString(Avg-Size-point*iDelta,5) = 1.06666
  PRINT(DoubleToString(Avg - (Size + point * iDelta), 5)); // DoubleToString(Avg-(Size+point*iDelta),5) = 1.06667
} 


其特殊性双双知道,但不是这样的,如果你改变加法的顺序(除了相对 非常不同的数字),结果是不同的!"。请向一个傻瓜解释,为什么这里会发生这种情况?

你只需要看一下源头的底部两行。

 

开发者的错误。

脚本不能编译,请查明原因))。使用所附文件。


同样的文件。


附加的文件:
Test1.mq5  9 kb