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

 

Может и не нужон он - интернет ваш перегруженный по дефолту оператор присваивания для классов?😄

Кому нужон - пусть сам себе явно перегрузит😄

Так ведь получше будет - уже не компилируется откровенная ерунда:

class A
  {
public:
   void operator=(const A&)=delete;
  };

void OnStart()
  {
   A object = new A(); // attempting to reference deleted function 'void A::operator=(const A&)'
  }

А в других языках тоже оператор присваивания для классов перегружается по дефолту (вопрос к тем, кто программирует на других языках)?

[EDIT]

Для структур то оно нормально - у них указателей нет.

А вот в случае с классами это препятствует дополнительным проверкам со стороны компилятора

 

Такой синтаксис используется в C++ для удаления конструктора по-умолчанию, например. Можно глянуть здесь.

 
fxsaber #:

Где про этот синтаксис почитать?

Нет якоря на странице, чтобы прям на этот раздел ссылку дать.

Перейдите по этой ссылке:

https://www.mql5.com/ru/docs/basis/types/classes#final_class

И скрольте вверх, там будет заголовок "Спецификатор delete":


 
Maxim Kuznetsov #:

всё ок...

указатель в mql это не указатель в C++. Вообще принципиально разные вещи и ближе к syntax sugar

вас попутывает A1-- :-)

Если путаю, то укажите конкретно где и что я путаю, а если не можете указать, то нечего понапрасну балаболить

 

В документации про это прямо сказано:

В отличие от C++, переменная hobject из вышеприведенного примера не является указателем на память, а является дескриптором объекта. Кроме того, в языке MQL5 все объекты в параметрах функции обязательно должны передаваться по ссылке.
Документация по MQL5: Основы языка / Типы данных / Указатели объектов
Документация по MQL5: Основы языка / Типы данных / Указатели объектов
  • www.mql5.com
Указатели объектов - Типы данных - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Vladislav Boyko #:

Нет якоря на странице, чтобы прям на этот раздел ссылку дать.

Перейдите по этой ссылке:

https://www.mql5.com/ru/docs/basis/types/classes#final_class

И скрольте вверх, там будет заголовок "Спецификатор delete":

https://www.mql5.com/ru/docs/basis/types/classes#delete

Спасибо!

Документация по MQL5: Основы языка / Типы данных / Структуры, классы и интерфейсы
Документация по MQL5: Основы языка / Типы данных / Структуры, классы и интерфейсы
  • www.mql5.com
Структуры, классы и интерфейсы - Типы данных - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Там (тут) хорошие примеры по передаче объектов в функцию.

Но я не понимаю, почему не упомянуто про передачу указателя в качестве простого типа - без ссылки. Именно так делаю, когда нужно хранить копию указателя:

class A {};

class B
  {
private:
   const A* m_ptr;
public:
   void initialize(const A* ptr)
     {
      m_ptr = ptr;
     }
  };

void OnStart()
  {
   A* a1 = new A;
   A  a2;
   B  b;
   b.initialize(a1);             // когда POINTER_DYNAMIC
   b.initialize(GetPointer(a2)); // когда POINTER_AUTOMATIC
   delete a1;
  }

В подобных случаях считаю, что такой вариант лучше, чем передача по ссылке.

Потому, что если метод принимает объект по ссылке, а сам объект изначально с POINTER_DYNAMIC, то получается + 2 излишних преобразования (указатель -> объект -> указатель):

class A {};

class B
  {
private:
   const A* m_ptr;
public:
   void initialize(const A& ptr)
     {
      m_ptr = GetPointer(ptr); // #2 объект -> указатель
     }
  };

void OnStart()
  {
   A* a1 = new A;
   B  b;
   b.initialize(a1); // #1 указатель -> объект
   delete a1;
  }

Лично я долго передавал по ссылке, а потом получал указатель. Потому, что не знал, что можно просто передать указатель.

 
В одном случае есть сообщение об ошибке, а в другом - нет:
class A {
protected:
    enum { x1 }; 
    static int x2;
};
int A::x2;
void OnStart()
{
    Print( A::x1 ); //(1)//нормально ???
    Print( A::x2 ); //(2)//Error: cannot access to protected member 'x' declared in class 'A'
}

А какая принципиальная разница?

 

Вопрос по сайту. При попытке прикрепить ex4 в работе выскакивает ошибка:

Что это может означать?