MQL5 Компилятор не различает класс и указатель на него - страница 2

 
SemenTalonov:

Вот и я ожидал копии.. Конструктор копирования по умолчанию это не ошибка.

Но Dmitry утверждает что будет выделен новый объект в памяти и вернется указатель типа POINTER_AUTOMATIC а копии не будет.

Каждый по своему понимает причуды MQL)

Ага. Деда Мороза, оказывается не существует.

Ни про какого объекта в памяти я не писал.

Ладно были когда-то были споры - как отличить ссылку от указателя. Но сейчас кажется объект от указателя отличить не получается.

 
Dmitry Fedoseev:

Откуда возьмется копия объекта? Копия указателя  - да, но указывающего на тот же самый объект.

У нас массив объектов. У первого элемента этого массива вызывается оператор присваивания, которому передается созданный отдельно объект (хотя, оператор необъявлен). Что по-твоему, после этого должно быть в первом элементе этого массива ? По-моему, объект и должен остаться.

 
SemenTalonov:

Я к тому это написал, что объявленный явно конструктор копирования ничего бы в этом тесте не изменил.

Как вы очевидного не замечаете..

в элемент массива объектов ложится указатель и в элемент массива указателей ложится объект.. это действительно нормально?

в первом случае в массив идет указатель на объект во втором случае должен сработать конструктор копирования, как эти операции могут быть равнозначны??

Не конструктор копирования, а оператор присваивания, но это мелочи. 

В элемент массива объектов - не "ложится укзатель". В элемент массива объектов должен ложиться именно объект.

В первом случае - у тебя именно массив объектов, какие "указатели"-то ?  

 
Georgiy Merts:

У нас массив объектов. У первого элемента этого массива вызывается оператор присваивания, которому передается созданный отдельно объект. Что по-твоему, после этого должно быть в первом элементе этого массива ? По-моему, объект и должен остаться.

А... там вообще все плохо))) Массив автоматических указателей, а в него еще впихивают объект создаваемый динамически. Тогда 3 объекта, два из них удалиться автоматически, а один утечет. Если это откомпилируется.

 

Должно быть так:

A* m_A[2];

и так:

m_A[0] =GetPointer(a); 
 

А в конце вот так:

for(int i=0;i<2;i++)if(CheckPointer(m_A[i])==POINTER_DINAMIC)delete(m_A[i]); 
 
Dmitry Fedoseev:

А... там вообще все плохо))) Массив автоматических указателей, а в него еще впихивают объект создаваемый динамически.

Ну наконец-то!))

Georgiy Merts:

 В элемент массива объектов должен ложиться именно объект.

В первом случае - у тебя именно массив объектов, какие "указатели"-то ?  

Вот и я про то! Почему это РАБОТАЕТ ?!

m_A[1] = new A();
 
SemenTalonov:

Ну наконец-то!))

Вот и я про то! Почему это РАБОТАЕТ ?!

Если A объявлен так:

A* m_A[2]; 

То все норм.

А если так:

A m_A[2]; 

То это не должно компилироваться. Или баг в компиляторе, или компилятор не обязан всё за всех думать.

 
Скорее всего не баг, присвоение же простых объектов должно работать, тогда надо самомe позаботиться об удалении объекта созданного через new.
 
Dmitry Fedoseev:

То это не должно компилироваться. Или баг в компиляторе, или компилятор не обязан всё за всех думать.

Бинго!

SemenTalonov 2019.01.10 07:36    EN
Тогда в общем случае, проблема звучит как: компилятор позволяет, в указатель типа POINTER_AUTOMATIC сохранить указатель типа POINTER_DYNAMIC, и наоборот.
Причина обращения: