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

 
coderex:

может кому интересно будет, ответ сервисдеск:

На данный момент оператор *(dereference/indirection) можно использовать только для указателей на объекты классов и это rvalue

Мне очень интересно! Прошу пояснить ответ Сервисдеска на примере.

& == GetPointer(). * - ничего не изменилось. 

 
fxsaber:

Мне очень интересно! Прошу пояснить ответ Сервисдеска на примере.

& == GetPointer(). * - ничего не изменилось. 

какой пример нужен?
 
coderex:

может кому интересно будет, ответ сервисдеск:

На данный момент оператор *(dereference/indirection) можно использовать только для указателей на объекты классов и это rvalue
Я кстати на днях отправил им предложение насчёт введения указателей на любые типы данных.  А это это нелепое ограничение уже достало.
 
Alexey Navoykov:
Я кстати на днях отправил им предложение насчёт введения указателей на любые типы данных.  А это это нелепое ограничение уже достало.
было бы неплохо ввести перегрузку оператора *, а то без него не получается реализовать идентичность с STL, так же неплохо бы ввести typedef в полной мере, а не только на calback`и
 
coderex:
было бы неплохо ввести перегрузку оператора *, а то без него не получается реализовать идентичность с STL, так же неплохо бы ввести typedef в полной мере, а не только на calback`и
Да, согласен. Всё в каком-то недоделанном состоянии.  А в плане перегрузок меня больше оператор приведения интересует, без него вообще тяжко.
 
coderex:
какой пример нужен?
Того, что Вам хочется из * и &. Что-нибудь простое, но наглядное. Чтобы видеть удобство.
 
fxsaber:
Того, что Вам хочется из * и &. Что-нибудь простое, но наглядное. Чтобы видеть удобство.

Того что мне хочется я уже написал выше.

Пример с оператором '&' можете сами придумать, где используете GetPointer(...), это по сути краткая форма

Пример с оператором '*' - не знаю поможет вам или нет в понимании:

class Iterator
  {
   int m_value;
public:
   Iterator(const int val) : m_value(val) { }
   int operator*() { return m_value; }
  };

int main(int argc, char **argv) {
   Iterator *_it = new Iterator(5);
  
   int _val = **_it;
//---
   return 0;
}


это работает в С++, но в MQL придется делать гетер на получение m_value.

 

Добавьте в Справку, что для перерисовывания OBJ_CHART ChartRedraw(MainChartID) не подходит. Нужен ChartRedraw(ObjChartID).

Поэтому пример из Справки некорректен. 

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

Прошу не ограничивать масштаб N <= 5 (размер области под бар = 2^N).

Это нужно (и стало целесообразно), чтобы можно было разглядывать тиковую историю подробнее.

 
Прошу пояснить. Скрипт
class A
{
public:
  const int a;
  
  A( int c = 0 ) : a(c) {}
  
  virtual int f()
  {
    Print(__FUNCTION__);
    
    return(this.a);
  }
};

class B : public A
{
public:
  const int b;
  
  B( int c = 0 ) : A(c), b(this.f()){}

  virtual int f()
  {
    Print(__FUNCTION__);
    
    return(this.a);
  }
};


void OnStart()
{
  B b;  
  A* a = new B;
  
  delete a;
}

Результат

2016.10.18 09:35:01.981 Test14 (GBPUSD,M1)      B::f
2016.10.18 09:35:01.981 Test14 (GBPUSD,M1)      B::f

По какой причине выдает B::F, а не A::f? Срипт написан так, что вызов f происходит ДО выполнения тела конструктора (жирным выделил). Но к этому моменту уже вызван конструктор базового класса A. Поэтому this.f(), вроде, должен относиться именно к базовому классу, пока еще не выполнился B-конструктор. Прошу пояснить, в чем ошибка в рассуждениях/преставлениях.

Причина обращения: