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

 
Aleksandr Slavskii #: Почему вы считаете это ошибкой? Это давно уже так. Если запустить скрипт из справки к IndicatorParameters, он сразу показывает, что input group является полноценным параметром индикатора, который нужно передавать во входные параметры функции iCustom()

Лично я считаю это неправильной реализацией, но понимаю, что MetaQuotes и некоторые другие пользователи могут не считать это проблемой.

Но я благодарю вас за ваши комментарии.

I personally consider it an incorrect implementation, but I understand that MetaQuotes and some other users may not consider this an issue.

But, I thank you for your comments.

 
Maxim Kuznetsov #:

всё ок...

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

Без разницы, что внутри. Синтаксис кривой, когда объект и указатель друг другу присваиваются.

class A {};

void OnStart()
{
  A* Pointer = NULL;
  A Object;
  
  Pointer = Object; // Кривой синтаксис.
  Pointer = GetPointer(Object);
  Pointer = &Object;
}
 
fxsaber #:

Совсем ерунда.

Ого, я не думал, что такое вообще скомпилируется.


Господа разработчики (или кто-нибудь), объясните пожалуйста, почему объект с id 2 удален два раза, а объект с id 1 не удалялся:

class A
  {
private:
   int  m_id;
public:
   void method()  { Alert(m_id);                }
        A(int id) { m_id = id;                  }
        ~A()      { Alert("destructor ", m_id); }
  };

void OnStart()
{
  A Object(1);
  f(Object);
  Object.method();
}

void f(A& a)
  {
   A SecondObject(2);
   a = SecondObject;
  }


 
Vladislav Boyko #:
Господа разработчики (или кто-нибудь), объясните пожалуйста, почему объект с id 2 удален два раза, а объект с id 1 не удалялся:

Без присваивания все удаляется норамльно:

class A
  {
private:
   int  m_id;
public:
   void method()  { Alert(m_id);                }
        A(int id) { m_id = id;                  }
        ~A()      { Alert("destructor ", m_id); }
  };

void OnStart()
{
  A Object(1);
  f(Object);
  Object.method();
}

void f(A& a)
  {
   A SecondObject(2);
   //a = SecondObject;
  }


А с присваиванием - чудеса.

 
Vladislav Boyko #:
А с присваиванием - чудеса
Очевидно, приватные поля копируются при присвоении.
 
Vladislav Boyko #:

почему объект с id 2 удален два раза, а объект с id 1 не удалялся:

Сначала SecondObject, затем Object (поля которого скопированы из SecondObject). Как со структурами.

 
Sergey Gridnev #:
Очевидно, приватные поля копируются при присвоении.
fxsaber #:

Сначала SecondObject, затем Object (поля которого скопированы из SecondObject).

Точно, спасибо, я не подумал, что поля копируются.


Warning бы хотя бы. Как по мне, плохо, что компилятор совсем игнорирует такое:

class A {};

void OnStart()
{
  A Object = new A();
}
 

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

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

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

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++ для удаления конструктора по-умолчанию, например. Можно глянуть здесь.