Скачать MetaTrader 5

Виртуальные функции в объектах таймсерий Стандартной Библиотеки

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
George Merts
3735
George Merts 2013.03.03 13:59 

В Сервисдеск написал, напишу еще тут.

Имеем код:

CiTime* pTime = new CiTime;            // 1.Создаем объект CiTime

pTime.Create(Symbol(),PERIOD_CURRENT); // 2.Инициализируем объект.

CSeries* pSTime = pTime;               // 3.Присваиваем указатель предку

pSTime.BufferResize(1000);             // 4.Вызываем ВИРТУАЛЬНУЮ функцию, но вызывается функция ПРЕДКА !!!

CiTime* pSecondTime = pSTime;          // 5.Присваиваем указатель потомку

pSecondTime.BufferResize(2000);        // 6. Вызываем ВИРТУАЛЬНУЮ функцию, вызывается ПРАВИЛЬНАЯ функция потомка 

 

Насколько я понимаю, раз функция BufferResize() везде объявлена виртуальной - и в четвертой, и в шестой строке должна вызываться функция реально созданного объекта CiTime::BufferResize().

Но у меня почему-то в четвертой строке вызывается функция вызывается функция CSeries::BufferResize().

Где ошибка ? Что я делаю неправильно ?  

George Merts
3735
George Merts 2013.03.03 15:32  

Да, нашел ошибку в Стандартной Библиотеке.  Написал в Сервисдеск.

Функции объявлены:

virtual bool CSeries::BufferResize( int size)

Но: 

virtual bool CiTime::BufferResize(const int size)

 

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

Считаю, что везде должен быть модификатор  const, а внутри функции CSeries::BufferResize(const int size) проверка на максимальную глубину истории в год для старших таймфреймов должна быть исправлена (например, с помощью локальной переменной)

 

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

 

 

George Merts
3735
George Merts 2013.03.04 07:25  

Да, в сервисдеске подтвердили наличие ошибки, пообещали исправить.

 

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий