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

 
Alexey Navoykov:
Т.е. вы предлагаете вообще запретить неявное разыменовывание указателей?  Не думаю, что многие тут будут этому рады.

Пусть у каждого будет выбор

#property strict

Мне такие фокусы точно не нужны.

 
SemenTalonov:

Ну это само собой. Тут сразу утечка памяти.

Утечка памяти, говорите? А если так? )))

#property strict

class A
 {
  A*  item;
  int num;
public:
  A(int p=10){num=p;item=NULL;} ~A(){if(CheckPointer(item)==POINTER_DYNAMIC) delete item;}
  A* operator=(A* par){ item = par; return&this; }
  A* operator~(){ return item; }
  int operator-(){ return num; }
 };

void OnStart()
 {
  A a = new A(20);
  printf("В автообъекте %i (%i) сохранен динамический объект %i (%i), который он в конце своего цикла сам уничтожает...",&a,-a,~a,-~a);
 }


 
Ilya Malev:

Утечка памяти, говорите? А если так? )))


delete item;

Так это предполагает, что объект готов что с ним так обойдутся. Многие ли предусматривают такую возможность?

 
SemenTalonov:

Так это предполагает, что объект готов что с ним так обойдутся. Многие ли предусматривают такую возможность?

Думаю, что если кто-то пишет слово new, он должен точно знать, где в другом месте его кода находится соответствующее ему слово delete.

 
Эта конструкция кстати, если её немного доработать, называется "сборщик мусора"))) 
 
SemenTalonov:

Пусть у каждого будет выбор

Мне такие фокусы точно не нужны.

strict уже в MQL4 используется. Как тогда там будет работать, если синтаксис языков одинаков?

Ну а в качестве защиты от таких действий можно в классе делать приватный метод:

class A
{
 private: void operator=(const A*);
}

Хотя я, честно говоря, не вижу тут проблемы.  Если ты объекту класса присваиваешь что-либо, то априори ожидаешь вызова оператора копирования. Хотел - получил. Какая разница, был там указатель или объект?  Тип класса тот же самый.  Никакой левый класс ты присвоить не сможешь.   Поэтому всё это больше похоже на пустое занудство.

Вот в противоположном случае, где слева указатель - другое дело.  Там ты мог ожидать, что присваиваешь что-то указателю, а оказалось - копируешь объект.

 
Alexey Navoykov:

Вот в противоположном случае, где слева указатель - другое дело.  Там ты мог ожидать, что присваиваешь что-то указателю, а оказалось - копируешь объект.

И запрещать это нельзя, иначе не получится скопировать объект, когда, действительно, нужно.

В итоге, нужно оставлять все, как есть. Просто отдавать себе отчет, что делаешь.

 
fxsaber:

И запрещать это нельзя, иначе не получится скопировать объект, когда, действительно, нужно.

В итоге, нужно оставлять все, как есть. Просто отдавать себе отчет, что делаешь.

О! Сказано главное. 

А много ли здесь народа, ориентирующегося в режимах управления памятью? Понимающего, в чем разница между AUTOMATIC и DYNAMIC. 

И что-нибудь слышавшего о STATIC и BASED (хотя, это - необязательно). 

 
fxsaber:

И запрещать это нельзя, иначе не получится скопировать объект, когда, действительно, нужно.

В итоге, нужно оставлять все, как есть. Просто отдавать себе отчет, что делаешь.

Почему не получится?  Есть же операторы * и &  для приведения к тому, что требуется.
 
Alexey Navoykov:
Почему не получится?  Есть же операторы * и &  для приведения к тому, что требуется.

Где есть * ?