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

 
fxsaber:

Возможно, и так. Сейчас на порядок можно еще как-то влиять через Swap input-строк в исходнике советника.

Это же убивает алгоритм оптимизации - все равно что оптимизировать в случайном направлении.

 
Stanislav Korotky:

Это же убивает алгоритм оптимизации - все равно что оптимизировать в случайном направлении.

Речь про полный перебор в первую очередь.

[Удален]  

Постепенно осваиваю ООП и встретился с одной неочевидной вещью.

Есть класс А, полями которого являются объекты другого класса В.

в классе А вызывается константный метод, возвращающий объект класса В.

После чего вызывается метод класса В, стирающий параметры полученного объекта.

Выглядит это так (пример упрощен, писался в браузере):

class B
{
private:
   int m_width;
   int m_length;
public:
   void Reset() { m_width = 0; m_length = 0; }
}
class A
{
private:
   B m_member;
public:
   B GetBMember() const { return( m_member ); }
}
//---
A obj;
obj.GetBMember().Reset();

В результате получается, что Reset() не срабатывает, т.е. поля m_member не очищаются.

Вопрос: не должен ли компилятор на этапе сборки сообщать (ошибку/предупреждение), что вызывается неконстантный метод для константного объекта (или что-то в этом духе)? 

 
Alexey Kozitsyn:

Вопрос: не должен ли компилятор на этапе сборки сообщать (ошибку/предупреждение), что вызывается неконстантный метод для константного объекта (или что-то в этом духе)? 


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

[Удален]  
Sergey Dzyublik:

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

Спасибо. Вероятно Вы правы, причем спецификатор const не влияет на результат (и с ним, и без него сброса не происходит).
 
Alexey Kozitsyn:

Постепенно осваиваю ООП и встретился с одной неочевидной вещью.

Есть класс А, полями которого являются объекты другого класса В.

в классе А вызывается константный метод, возвращающий объект класса В.

После чего вызывается метод класса В, стирающий параметры полученного объекта.

Выглядит это так (пример упрощен, писался в браузере):

В результате получается, что Reset() не срабатывает, т.е. поля m_member не очищаются.

Вопрос: не должен ли компилятор на этапе сборки сообщать (ошибку/предупреждение), что вызывается неконстантный метод для константного объекта (или что-то в этом духе)? 

Возвращайте указатели.
class B
{
private:
   int m_width;
   int m_length;
public:
   void Reset() { m_width = 0; m_length = 0; }
}
class A
{
private:
   B m_member;
public:
   B *GetBMember() const { return( &m_member ); }
}
//---
A obj;
obj.GetBMember().Reset();
[Удален]  
Andrey Barinov:
Возвращайте указатели.
Спасибо за идею. Совсем про них забыл.
 
Alexey Kozitsyn:
Спасибо за идею. Совсем про них забыл.

Странно. У меня ваш код выдает ошибку компиляции.

object of 'B' cannot be returned, copy constructor 'B::B(const B &)' not found

на описании функции GetBMember (что на чистом английском говорит о создании копии). Последняя ли версия компилятора?

Когда эта проблема фиксится добавлением копи-конструктора B, то потом Вы можете возвращать const B из метода GetBMember.

Тогда компилятор будет ругаться на попытку сделать Reset возвращаемой переменной:

'Reset' - call non-const method for constant object

[Удален]  
Stanislav Korotky:

Странно. У меня ваш код выдается ошибку компиляции.

object of 'B' cannot be returned, copy constructor 'B::B(const B &)' not found

на описании функции GetBMember. Последняя ли версия компилятора?

Когда эта проблема фиксится добавлением копи-конструктора B, то потом Вы можете возвращать const B из метода GetBMember.

Тогда компилятор будет ругаться на попытку сделать Reset возвращаемой переменной:

'Reset' - call non-const method for constant object

Этот код - просто пример, написанный в браузере. Просто было интересно, почему компилятор ничего не сообщает. Но уже разобрался.

И, в моем примере вообще нет конструкторов:)

 

     Здравствуйте! 2017.08.03_18:45 GMT+3. Написал файл ООП SignalIchimoku.mqh . Но, когда нужно сделать несложные вычисления до LongCondition() и ShortCondition() в отдельной функции, функция написана, компилятор выдаёт 0 ошибок, 0 предупреждений. А эта функция не работает, вычисления не производятся. Программа не открывает сделки. Проверяю: вставил Print() значения переменной в функцию. Эта функция подобна функциям StateStoch(int ind), ExtStateStoch(int ind) и CompareMaps() в SignalStoch.mqh , стандартном файле из стандартной библиотеки. В стандартном файле всё работает, а у меня не работает. Почему? Это опять "простые правила"? Кто знает, -- подскажите. Если нужны подробности или возникли вопросы, -- пишите. 18:59 GMT+3.

Файлы: