Ошибки, баги, вопросы - страница 2327

 
Alexey Navoykov:
Предлагаю не спорить, а просто поверить мне, что это ошибка.

Этот глагол слабо применим на техническом форуме. Попробовал C++

class A {  };

class B : public A { };

A* a = new B;

B* b= dynamic_cast<B*>(a); // cannot dynamic_cast ‘a’ (of type ‘class A*’) to type ‘class B*’ (source type is not polymorphic)
B* b1= a; // invalid conversion from ‘A*’ to ‘B*’ [-fpermissive]

Ни один из вариантов не прокатил. Причины не ясны.

 
Koldun Zloy:

Если сделать их взаимозаменяемыми, тогда они оба просто не нужны.

В C++ возможно такое:

Я предлагал простейший вариант, который может быть реализован уже завтра (а не через 10 лет) и была бы внешняя схожесть с C++ (а иначе зачем вообще что-то менять). Тем более что если operator*() не стали и не будут делать (была об этом информация на форуме), непонятно почему operator->() вдруг реализовали бы (они одного порядка)

 
Alexey Navoykov:

Почему в MQL до сих пор не исправлен баг, что базовый класс неявно приводится к производному классу?  Даже предупреждения компилятора нет!

вы ждете ошибки компиляции? так ее не должно быть, потому что в данном случае это dynamic_cast
 
TheXpert:
вы ждете ошибки компиляции? так ее не должно быть, потому что в данном случае это dynamic_cast
Cмотрите выше, fxsaber привёл C++ код.
 
Alexey Navoykov:
Cмотрите выше, fxsaber привёл C++ код.

компилится

class A 
{ 
public:
    virtual ~A() = default; 
};

class B : public A { };

int main(void)
{
    A* a = new B;
    B* b= dynamic_cast<B*>(a);
    return 0;
}
 
TheXpert:

компилится

Вы невнимательны
 
Alexey Navoykov:
Вы невнимательны

или вы. давайте сразу по делу

[Удален]  
A100:

Я предлагал простейший вариант, который может быть реализован уже завтра (а не через 10 лет) и была бы внешняя схожесть с C++ (а иначе зачем вообще что-то менять). Тем более что если operator*() не стали и не будут делать (была об этом информация на форуме), непонятно почему operator->() вдруг реализовали бы (они одного порядка)

В таком виде он не нужен ни завтра ни через 10 лет. И внешняя схожесть не нужна, нужны возможности.

Чтоб хотя бы частично перенести STL из C++. А там дело не упирается только в operator->, там ещё много чего нужно.

operator-> был бы первым шагом на пути к умным указателям.


 

На самом деле с неявным кастом в том виде в котором он сейчас все не очень хорошо.

class A
{};

class B : public A
{};

void OnStart()
{
   A* ab = new B;
   A* aa = new A;
   
   B* bb = ab; // ok
   
   B* ba1 = dynamic_cast<B*>(aa);
   Print(ba1 ? "ba1 ok" : "ba1 bad cast"); // bad cast

   B* ba2 = aa; // здесь неконтролируемый вылет
   Print(ba2 ? "ba2 ok" : "ba2 bad cast");
}

Видно, что dynamic cast включен в неявный каст

НО

во-первых непонятно зачем он включен если в языке dynamic cast явно присутствует

во-вторых он включен очень плохо, потому что ошибку dynamic cast в случае функции можно контролировать (на выходе плохой указатель), а неявный каст нельзя! потому что он бросает неконтролируемое исключение

2018.11.23 20:31:47.348    test (AUDNZD,M5)    incorrect casting of pointers in 'test.mq5' (17,11)

толку от него такого ровно ноль.

надо или давать невалидный указатель, как функция, или исключить dynamic cast из неявного каста и давать ошибку компиляции.

 

Да, при наличии этой проблемы, работа с ООП плохо контролируема и ненадёжна.  Где-то поменял тип в одном месте программы, а потом рванёт неизвестно где.  В данных примерах ещё можно как-то выкрутиться с помощью костылей, т.к. тут простое присвоение указателей, и всё перед глазами.  А в общем случае, когда указатель передаётся в какую-то функцию и динамически кастится неизвестно к чему, то уже никак не проконтролируешь.