Постепенно осваиваю ООП и встретился с одной неочевидной вещью.
Есть класс А, полями которого являются объекты другого класса В.
в классе А вызывается константный метод, возвращающий объект класса В.
После чего вызывается метод класса В, стирающий параметры полученного объекта.
Выглядит это так (пример упрощен, писался в браузере):
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 не очищаются.
Вопрос: не должен ли компилятор на этапе сборки сообщать (ошибку/предупреждение), что вызывается неконстантный метод для константного объекта (или что-то в этом духе)?
Вопрос: не должен ли компилятор на этапе сборки сообщать (ошибку/предупреждение), что вызывается неконстантный метод для константного объекта (или что-то в этом духе)?
Возможно, причина в вызове неявного конструктора копирования в результате Reset вызывается для временного объекта.
Постепенно осваиваю ООП и встретился с одной неочевидной вещью.
Есть класс А, полями которого являются объекты другого класса В.
в классе А вызывается константный метод, возвращающий объект класса В.
После чего вызывается метод класса В, стирающий параметры полученного объекта.
Выглядит это так (пример упрощен, писался в браузере):
В результате получается, что 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();
Здравствуйте! 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.
Возможно, и так. Сейчас на порядок можно еще как-то влиять через Swap input-строк в исходнике советника.
Это же убивает алгоритм оптимизации - все равно что оптимизировать в случайном направлении.
Это же убивает алгоритм оптимизации - все равно что оптимизировать в случайном направлении.
Речь про полный перебор в первую очередь.
Постепенно осваиваю ООП и встретился с одной неочевидной вещью.
Есть класс А, полями которого являются объекты другого класса В.
в классе А вызывается константный метод, возвращающий объект класса В.
После чего вызывается метод класса В, стирающий параметры полученного объекта.
Выглядит это так (пример упрощен, писался в браузере):
В результате получается, что Reset() не срабатывает, т.е. поля m_member не очищаются.
Вопрос: не должен ли компилятор на этапе сборки сообщать (ошибку/предупреждение), что вызывается неконстантный метод для константного объекта (или что-то в этом духе)?
Вопрос: не должен ли компилятор на этапе сборки сообщать (ошибку/предупреждение), что вызывается неконстантный метод для константного объекта (или что-то в этом духе)?
Возможно, причина в вызове неявного конструктора копирования в результате Reset вызывается для временного объекта.
Возможно, причина в вызове неявного конструктора копирования в результате Reset вызывается для временного объекта.
Постепенно осваиваю ООП и встретился с одной неочевидной вещью.
Есть класс А, полями которого являются объекты другого класса В.
в классе А вызывается константный метод, возвращающий объект класса В.
После чего вызывается метод класса В, стирающий параметры полученного объекта.
Выглядит это так (пример упрощен, писался в браузере):
В результате получается, что Reset() не срабатывает, т.е. поля m_member не очищаются.
Вопрос: не должен ли компилятор на этапе сборки сообщать (ошибку/предупреждение), что вызывается неконстантный метод для константного объекта (или что-то в этом духе)?
Возвращайте указатели.
Спасибо за идею. Совсем про них забыл.
Странно. У меня ваш код выдает ошибку компиляции.
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
Странно. У меня ваш код выдается ошибку компиляции.
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.