错误、漏洞、问题 - 页 1890 1...188318841885188618871888188918901891189218931894189518961897...3184 新评论 Renat Fatkhullin 2017.05.13 17:07 #18891 fxsaber: 什么是执行错误这是正确的,你不能从下往上开,只能从上往下开。这是为了安全起见。你不能和C++比较--在那里任何东西都可以被还原成任何东西。 Konstantin 2017.05.13 17:09 #18892 Комбинатор: 在C++中,也只有当一个基类的指针指向它的子类时,它才能发挥作用。我不知道你说的是什么意思,但这个代码。class CLASS1 { public: int i; }; class CLASS2 : public CLASS1 {}; int main() { CLASS1 _object; CLASS2 *_ptr = (CLASS2*)&_object; _ptr->i = 1; return 0; }在C++中工作,这就是我上面写的。这里是同样的代码(考虑到MQL语法)。class CLASS1 { public: int i; }; class CLASS2 : public CLASS1 {}; int OnInit() { CLASS1 _object; CLASS2 *_ptr = dynamic_cast<CLASS2 *>(&_object); _ptr.i = 1; return 0; } 不再起作用,因为_ptr 得到NULL这就引出了一个问题,这是否是MQL的一个错误,它是否会被修复,还是会一直这样? Konstantin 2017.05.13 17:10 #18893 Renat Fatkhullin:这是正确的,你不能从下往上开,只能从上往下开。这是为了安全起见。你不能和C++比较--在那里任何东西都可以被还原成任何东西。 现在明白了,谢谢你的澄清 )) TheXpert 2017.05.13 17:12 #18894 Konstantin:我不知道你说的是什么意思,但这个代码。 好吧,试着去理解它。首先,让dynamic_cast在正数中工作。如果你自己搞清楚,你会好得多。 TheXpert 2017.05.13 17:17 #18895 Renat Fatkhullin:这是正确的,你不能从下往上开,只能从上往下开。 你的意思是,你不能从一个基类被投到一个子类? Renat Fatkhullin 2017.05.13 17:19 #18896 Комбинатор: 你的意思是你不能从基类投向子类?是的,在基类没有实际构造的后裔的情况下。 Konstantin 2017.05.13 17:19 #18897 Renat Fatkhullin:这是正确的,你不能从下往上开,只能从上往下开。这是为了安全起见。 如果我们把指针从上到下,也就是带到父代,然后把指针传到作用域中的其他地方,那么子代的字段在那里是否可用? TheXpert 2017.05.13 17:19 #18898 Renat Fatkhullin:是的。 Renate,你知道什么是dynamic_cast吗? Renat Fatkhullin 2017.05.13 17:21 #18899 Комбинатор: Renat,你知道什么是dynamic_cast吗?当然了。 看看所讨论的这段MQL5代码。一个基础实例被创建,然后它英勇地试图通过动态广播转换为子代,这违反了安全性。嗯,这当然是个无奈之举。 Renat Fatkhullin 2017.05.13 17:24 #18900 同样的例子在文件中也有直接的讨论和解释。只有在安全检查和转换允许性检查通过后,才会在运行时触发动态铸造。每个MQL5对象都有所有的元信息,以便在运行时检查权限。这不是空洞的C++。使用dynamic_cast操作符的动态类型转换使用dynamic_cast操作符可以动态地投掷类型,它只能应用于类指针。在这种情况下,类型的正确性检查是在程序执行的时刻进行的。这意味着当使用dynamic_cast操作符时,编译器并不检查用于转换的数据类型。如果将一个指针转换为一个数据类型,而这个类型不是实际的对象类型,那么结果将是NULL。dynamic_cast<type-id> ( expression )角括号中的 type-id 参数 必须是一个指向先前定义的类类型的 指针。表达式操作数类型 (相对于C++而言)可以是任何东西,除了void。例子。class CBar { }; class CFoo :public CBar { }; 空白 的OnStart() {CBar酒吧。 //---- 允许将指针类型*bar动态转换为指针*fooCFoo *foo =dynamic_cast<CFoo*>(&bar);//---没有执行的关键错误Print(foo);// foo=NULLfoo=(CFoo *)&bar。// 将发生一个关键的执行错误Print(foo);// 这一行将不会被执行} 利用MQL进行MQL解析 单纯使用 MQL5 语言处理 ZIP 1...188318841885188618871888188918901891189218931894189518961897...3184 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
什么是执行错误
这是正确的,你不能从下往上开,只能从上往下开。这是为了安全起见。
你不能和C++比较--在那里任何东西都可以被还原成任何东西。
在C++中,也只有当一个基类的指针指向它的子类时,它才能发挥作用。
我不知道你说的是什么意思,但这个代码。
这是正确的,你不能从下往上开,只能从上往下开。这是为了安全起见。
你不能和C++比较--在那里任何东西都可以被还原成任何东西。
现在明白了,谢谢你的澄清 ))
我不知道你说的是什么意思,但这个代码。
这是正确的,你不能从下往上开,只能从上往下开。
你的意思是你不能从基类投向子类?
是的,在基类没有实际构造的后裔的情况下。
这是正确的,你不能从下往上开,只能从上往下开。这是为了安全起见。
是的。
Renat,你知道什么是dynamic_cast吗?
当然了。
看看所讨论的这段MQL5代码。一个基础实例被创建,然后它英勇地试图通过动态广播转换为子代,这违反了安全性。嗯,这当然是个无奈之举。
同样的例子在文件中也有直接的讨论和解释。只有在安全检查和转换允许性检查通过后,才会在运行时触发动态铸造。每个MQL5对象都有所有的元信息,以便在运行时检查权限。这不是空洞的C++。
使用dynamic_cast操作符的动态类型转换
使用dynamic_cast操作符可以动态地投掷类型,它只能应用于类指针。在这种情况下,类型的正确性检查是在程序执行的时刻进行的。这意味着当使用dynamic_cast操作符时,编译器并不检查用于转换的数据类型。如果将一个指针转换为一个数据类型,而这个类型不是实际的对象类型,那么结果将是NULL。
dynamic_cast<type-id> ( expression )
角括号中的 type-id 参数 必须是一个指向先前定义的类类型的 指针。表达式操作数类型 (相对于C++而言)可以是任何东西,除了void。
例子。
class CBar { };
class CFoo :public CBar { };
空白 的OnStart()
{
CBar酒吧。
//---- 允许将指针类型*bar动态转换为指针*foo
CFoo *foo =dynamic_cast<CFoo*>(&bar);//---没有执行的关键错误
Print(foo);// foo=NULL
foo=(CFoo *)&bar。// 将发生一个关键的执行错误
Print(foo);// 这一行将不会被执行
}