错误、漏洞、问题 - 页 2356 1...234923502351235223532354235523562357235823592360236123622363...3184 新评论 fxsaber 2018.12.23 21:06 #23551 A100:在C++中:A::f()这个代码说的是什么? ((A*)&b).f(); Ilya Malev 2018.12.23 23:51 #23552 fxsaber:这个代码说的是什么? 这也是一样的。 A100 2018.12.24 09:52 #23553 Ilya Malev:同样的事情。 作为MQL(假设它被转换为C++形式)。但你 可以自己检查一下 Ilya Malev 2018.12.24 14:24 #23554 A100: 这和MQL(假设它被转换为C++形式)。但你 可以自己检查一下已检查。 Alexey Navoykov 2018.12.24 14:40 #23555 Ilya Malev:已检查。我认为你检查的东西是错误的。 B*b1=a;在MQL中,这样的条目意味着将一个对象a-复制到一个由指针b1定位的对象。 当然,一般来说,它不应该被编译。 为了不混淆对象和指针,你最好对指针使用p前缀 Ilyas 2018.12.24 14:52 #23556 Ilya Malev:已检查。 请不要把这种错误的行为记录在册。 这里有两个问题(?)。 B *b1=a - 一个显式错误,编译器认为这个结构是对复制操作符A::A(const A &)的调用。在第一种情况下,优化器检测到A::A(const A &)是空的,没有成员--没有通过 "指针 "访问(事实上,没有调用复制操作符的代码,一切都被剪掉了)。 虚拟的B::f()没有被重载,所以它不是一个虚拟的调用,而是一个简单的调用,B::f()中没有成员寻址,所以通过 "指针 "访问也被删除了 在第二种情况下,A::f()是一个尝试性的虚拟调用,有 "指针 "访问,但没有a1对象,因为一个空的复制构造函数A::A(const A &)也被调用,用于A *a1=b。 Alexey Navoykov 2018.12.24 15:05 #23557 Ilyas:请不要在这种错误的行为上投资。这里有两个问题(?)。我希望你们能解决这个错误的行为?(犯编译错误)因为有可能意外地犯这样的错误,而编译器没有任何反应。 Ilyas 2018.12.24 15:06 #23558 Alexey Navoykov:我希望你们能解决这个错误的行为?因为有可能不小心犯这样的错误,而编译器却没有任何反应。是的,我们将修复它。 优先级被设置得很低,因为只有空的类才能得到工作代码 Ilya Malev 2018.12.24 15:19 #23559 Ilyas:请不要在这种错误的行为上投资。 这里有两个问题(?)。 B *b1=a - 一个明显的错误,编译器认为这个结构是对复制操作符A::A(const A &)的调用。在第一种情况下,优化器已经确定A::A(const A &)是空的,没有成员--没有通过 "指针 "访问(事实上,没有调用复制操作符的代码,一切都被删掉了)。 虚拟的B::f()没有被重载,所以它不是一个虚拟的调用,而是一个简单的调用,B::f()中没有成员寻址,所以通过 "指针 "访问也被删除了 在第二种情况下,A::f()是一个尝试性的虚拟调用,有 "指针 "访问,但没有a1对象,因为一个空的复制构造函数A::A(const A &)也被调用,用于A *a1=b。谢谢你的详细回答,然而,我对这个逻辑有点迷惑。 1) 为什么编译器将构造B* b1=a视为调用复制运算符A::A(const A&),(而不是调用B::B(const A&),因为它是运算符=左边的类B)? 2)为什么编译器没有产生 "缺少复制构造函数 "的警告? 3)为什么对不存在的对象允许 "简单 "的方法调用(而试图直接调用B::f()会出现 "不是静态方法 调用 "的编译错误)? 4)为什么编译器允许一个 "简单的 "虚拟方法调用?在我看来,虚拟性不应该取决于对象中数据的存在与否 Alexey Navoykov 2018.12.24 15:29 #23560 Ilya Malev: 1)为什么编译器将B* b1=a看作是对复制运算符A::A(const A&)的调用,(而不是调用B::B(const A&),因为它是运算符=左边的B类)。这是MQL的另一个错误,编译器允许这样的事情:B b = a; 这违反了封装原则。 在C++中,这样的事情不能自然编译,需要明确的转换。 而在旧的MQL构建中,这样的事情也不能做。 1...234923502351235223532354235523562357235823592360236123622363...3184 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
在C++中:A::f()
这个代码说的是什么?
这个代码说的是什么?
这也是一样的。
同样的事情。
这和MQL(假设它被转换为C++形式)。但你 可以自己检查一下
已检查。
已检查。
我认为你检查的东西是错误的。
在MQL中,这样的条目意味着将一个对象a-复制到一个由指针b1定位的对象。 当然,一般来说,它不应该被编译。
为了不混淆对象和指针,你最好对指针使用p前缀
已检查。
请不要把这种错误的行为记录在册。
这里有两个问题(?)。
虚拟的B::f()没有被重载,所以它不是一个虚拟的调用,而是一个简单的调用,B::f()中没有成员寻址,所以通过 "指针 "访问也被删除了
在第二种情况下,A::f()是一个尝试性的虚拟调用,有 "指针 "访问,但没有a1对象,因为一个空的复制构造函数A::A(const A &)也被调用,用于A *a1=b。
请不要在这种错误的行为上投资。
这里有两个问题(?)。
我希望你们能解决这个错误的行为?(犯编译错误)因为有可能意外地犯这样的错误,而编译器没有任何反应。
我希望你们能解决这个错误的行为?因为有可能不小心犯这样的错误,而编译器却没有任何反应。
是的,我们将修复它。
优先级被设置得很低,因为只有空的类才能得到工作代码
请不要在这种错误的行为上投资。
这里有两个问题(?)。
虚拟的B::f()没有被重载,所以它不是一个虚拟的调用,而是一个简单的调用,B::f()中没有成员寻址,所以通过 "指针 "访问也被删除了
在第二种情况下,A::f()是一个尝试性的虚拟调用,有 "指针 "访问,但没有a1对象,因为一个空的复制构造函数A::A(const A &)也被调用,用于A *a1=b。
谢谢你的详细回答,然而,我对这个逻辑有点迷惑。
1) 为什么编译器将构造B* b1=a视为调用复制运算符A::A(const A&),(而不是调用B::B(const A&),因为它是运算符=左边的类B)?
2)为什么编译器没有产生 "缺少复制构造函数 "的警告?
3)为什么对不存在的对象允许 "简单 "的方法调用(而试图直接调用B::f()会出现 "不是静态方法 调用 "的编译错误)?
4)为什么编译器允许一个 "简单的 "虚拟方法调用?在我看来,虚拟性不应该取决于对象中数据的存在与否
1)为什么编译器将B* b1=a看作是对复制运算符A::A(const A&)的调用,(而不是调用B::B(const A&),因为它是运算符=左边的B类)。
这是MQL的另一个错误,编译器允许这样的事情:B b = a; 这违反了封装原则。 在C++中,这样的事情不能自然编译,需要明确的转换。 而在旧的MQL构建中,这样的事情也不能做。