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

 
Karputov Vladimir:

Есть подозрение что настройка заливки "Вернуть" вообще у всех торговых серверов стоит по-умолчанию (по крайней мере в FxPro так и ответили

Другими словами - это какая-то заглушка.

В некоторых конторах (в частности недавно запустивших МТ5) необходимо явно указывать тип заливки - если не указывать будет ошибка.

Хотя, в том же Robo сервер возвращает true на проверку заполнения "Вернуть", но по факту этот тип заливки не работает. Короче полная путаница с этими заливками. 

 
Комментарии, не относящиеся к этой теме, были перенесены в "CHART_SHOW_OHLC для OBJ_CHART".
 
Явно торможу
class A
{
public:
  virtual int f()
  {
    Print(__FUNCSIG__);
    
    return(0);
  }
};

class B : public A
{
public:
  virtual int f()
  {
    Print(__FUNCSIG__);
    
    return(0);
  }
};

void OnStart()
{
//  A* b = new B;
  B* b = new B;
  
  ((A*)b).f();

  delete b;
}
Правильно ли понимаю, что если virtual в потомке переопределен, то до базового virtual никогда не достучаться? Т.е. нельзя никак из b вызвать A::f.
 
fxsaber:
Правильно ли понимаю, что если virtual в потомке переопределен, то до базового virtual никогда не достучаться? Т.е. нельзя никак из b вызвать A::f.

Почти. В С++ разрешена следующая запись:

B* b = new B;
b.A::f();

Но здесь так нельзя. Поэтому только и исключительно костылем:

class B : public A
{
public:
  virtual int f()
  {
    Print(__FUNCSIG__);
    
    return(0);
  }
  
  int f1()
  {
    return A::f();
  }
};
 
Комбинатор:

Почти. В С++ разрешена следующая запись:

B* b = new B;
b.A::f();

Тогда не понимаю, почему в C++ это работает. Ведь переопределенный virtual в таблице виртуальный методов полностью переопределиться должен. И от базового и следа там не должно быть.

Но здесь так нельзя. Поэтому только и исключительно костылем:

class B : public A
{
public:
  virtual int f()
  {
    Print(__FUNCSIG__);
    
    return(0);
  }
  
  int f1()
  {
    return A::f();
  }
};
Тогда A* b = new B; не подойдет.
 
fxsaber:

Ведь переопределенный virtual в таблице виртуальный методов полностью переопределиться должен. И от базового и следа там не должно быть.

Если явно указан тип, метод вызывается напрямую, без использования таблицы виртуальных функций.

Так можно вызвать даже чисто виртуальную функцию, если у нее есть тело.

fxsaber:
Тогда A* b = new B; не подойдет.

Для такого случая надо другой костыль -- перенести в базовом классе внутренности функции в невиртуальный метод и вызывать его внутри виртуального. Тогда можно будет явно вызвать невиртуальный метод у базового класса и у наследника. 

 
Комбинатор:

Если явно указан тип, метод вызывается напрямую, без использования таблицы виртуальных функций.

Так можно вызвать даже чисто виртуальную функцию, если у нее есть тело.

Для такого случая надо другой костыль -- перенести в базовом классе внутренности функции в невиртуальный метод и вызывать его внутри виртуального. Тогда можно будет явно вызвать невиртуальный метод у базового класса и у наследника. 

Понял, Спасибо!
 
Как в отладчике посмотреть, какое значение вернула функция через return? Ставлю точку останова на return. Как попадаю на нее, жму F10. Как теперь увидеть, что же вышло в return?
 
fxsaber:
Как в отладчике посмотреть, какое значение вернула функция через return? Ставлю точку останова на return. Как попадаю на нее, жму F10. Как теперь увидеть, что же вышло в return?
shift + F9 ('add watch')
но так как у вас все видимо на классах построено, то в скором времени можно ждать с десяток гневных писем как в Meta Editore ужасно, плохо, и не удобно с отладкой)) 
 
Наткнулся у себя на хороший пример
class A
{
public:
  void operator =( const string Value ) const { return; }

  void operator =( const int Value ) { return; }
};

void OnStart()
{
  const A a;

  a = 0; // implicit conversion from 'number' to 'string'
}
Не очевидно было в начале, почему предупреждение. Умный компилятор, однако.