Обсуждение статьи "Когда нужно использовать указатели в MQL5" - страница 4

 
tol64:
Ты нашёл дыру в безопасности? )
Ага. Так напрямую кастовать неправославно. В плюсах специально для этого есть dynamic_cast, здесь полностью корректно привести не получится и это потенциальный источник неявных и серьезных ошибок. И по серьезности это ненамного лучше чем небезопасные указатели и ссылки.
 
denkir:

А не лучше воспользоваться полиморфизмом?

Примерно так:

Дело в том, что у классов наследников CChartObjectRectLabelCChartObjectButton и CChartObjectEdit, есть свои уникальные методы, к которым нужно получить доступ. А у базового класса CChartObject из стандартной библиотеки нет таких же виртуальных. 

 

На моём примере выше...

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Обсуждение статьи "Когда нужно использовать указатели в MQL5"

tol64, 2014.11.05 14:47

А можно ли создать массив с объектами разных типов?

Допустим вот такой пример:

[код]

//---

Как получить доступ к методам классов наследников? 


...получилось вот так:

//--- objects[0]. // Как получить доступ к методам класса CChartObjectEdit ?
//    1.
   Print("((CChartObjectEdit *)objects[0]).BackColor(): ",((CChartObjectEdit *)objects[0]).BackColor());
//--- 2.
   CChartObjectEdit *e=(CChartObjectEdit *)objects[0];
   Print("e.BackColor(): ",e.BackColor());
   
//--- objects[1]. // Как получить доступ к методам класса CChartObjectButton ?
//    1.
   Print("((CChartObjectButton *)objects[1]).State(): ",((CChartObjectButton *)objects[1]).State());
//--- 2.
   CChartObjectButton *b=(CChartObjectButton *)objects[1];
   Print("b.State(): ",b.State());
   
//--- objects[2]. // Как получить доступ к методам класса CChartObjectRectLabel ?
//    1.
   Print("((CChartObjectRectLabel *)objects[2]).BackColor(): ",((CChartObjectRectLabel *)objects[2]).BackColor());
//--- 2.
   CChartObjectRectLabel *r=(CChartObjectRectLabel *)objects[2];
   Print("r.BackColor(): ",r.BackColor());
 
TheXpert:
Ага. Так напрямую кастовать неправославно. В плюсах специально для этого есть dynamic_cast, здесь полностью корректно привести не получится и это потенциальный источник неявных и серьезных ошибок. И по серьезности это ненамного лучше чем небезопасные указатели и ссылки.

Да, прежде чем сюда на форум вопрос задавать в сети нашёл, что в C++ есть оператор dynamic_cast (механизм динамической идентификации данных). 

Вот смотрю сейчас по ссылке выше:

// Механизм динамической идентификации типа данных доступен только для полиморфных 
// классов (т.е. классов, содержащих хотя бы одну виртуальную функцию-член)

То есть, это обязательное условие? И если в базовом классе нет ни одного виртуального метода, то dynamic_cast работать не будет?

P.S. >>> Вот здесь ещё читаю о dynamic_cast (MSDN). 

 
TheXpert:
Блин, и вы после этого про безопасность языка говорите?

Вероятно, вы думаете, что можно свободно приводить к чему угодно как в С/С++.

Это не так и с безопасностью все в порядке.

 
Renat:

Вероятно, вы думаете, что можно свободно приводить к чему угодно как в С/С++.

Это не так и с безопасностью все в порядке.

Случайно получил вот такую ошибку, что похоже подтверждает Ваши слова. ) 

2014.11.06 14:33:36.588 OOP_Test (EURCHF,M5)   incorrect casting of pointers in 'Test1.mqh' (931,13)
 
Renat:

Это не так и с безопасностью все в порядке.

Нет, нельзя нормально сделать проверку dynamic_cast в время компиляции.
 
TheXpert:
Нет, нельзя нормально сделать проверку dynamic_cast в время компиляции.

Комментом выше показ результат проверки кастинга в рантайме.

Он у нас очень жесткий, работает на RTTI механизме, так как мы точно знаем кто есть кто при приведениях.

 
Renat:

Комментом выше показ результат проверки кастинга в рантайме.

Упс... попутал. Подумал чего-то что это компилятора. Тогда беру свои слова обратно.
Причина обращения: