call non-const method for constant object

 

Я чутка переделал один класс, дабы оптимизировать количество параметров, которые передаю в функцию. Решил использовать класс SymbolProperties, который является своего рода экземпляром выбранного торгового инструмента. Так вот, мне нужно его передавать в метод orderSend() другого класса через параметры, чтобы в из этого экземпляра брать данные выбранного торгового инструмента, там где они понадобятся.

Есс-но, тестирую сейчас в самом тестовом эксперте прямо из OnTick() вызываю этот метод, который посылает ордер. На параметры метода orderSend() просьба не обращать внимания, т.к. это всё наобум. Не написаны у меня ещё все классы для работы. Попутно пишу и тестирую всё))

Вот что имеется в исполняемого файле эксперта:

#include  <HOZ_Code\Classes\SymbolProperties.mqh>
//...
SymbolProperties *ptrSymbol;
OrdersHandling   *ptrOrdersHandling;
//...
int OnInit() {
//---
  flag = false;
  ptrOrdersHandling = new OrdersHandling();
  return INIT_SUCCEEDED;
}
//...
void OnTick() {
  if (!flag) {
    ptrSymbol = new SymbolProperties("GBPUSD");
    ptrOrdersHandling.orderSend(ptrSymbol, ORDER_TYPE_BUY_STOP, 3333021, 0.1, lastTick.ask + 0.00010, lastTick.ask + 0.00015, lastTick.ask, lastTick.ask + 0.00040, "ордер послан");
    flag = true;
  }
}

Так вот в самом классе управления ордерами OrdersHandling метод, по поводу которого у меня вопрос и который у нас в OnTick() вызывается вот так выглядит в начале:

bool OrdersHandling :: orderSend(const SymbolProperties& symbol, const ENUM_ORDER_TYPE type, const ulong magic, const double lot, const double price, const double stopLimit, const double SL, const double TP, const string comment) {
  //---
  clearTradeStructures();
  Print("symbol.getName = ", symbol.getName);
  Print("symbol.digitsCount = ", symbol.digitsCount);

  // здесь проверки условий и присвоение нужных данных в торговые структуры
  
  return OrderSend(m_request, m_result);
}

Я спецом вывел 2 прнта в методе orderSend():

  Print("symbol.getName = ", symbol.getName());
  Print("symbol.digitsCount = ", symbol.digitsCount());

Чтобы увидеть, верно ли я передал класс, т.к. там должны быть те данные, которые являются верными для данного символа. Потом я расширю принт, но пока что для теста базового пару данных вывел.

Так вот на обоих принтах компилятор ругается так:

'digitsCount' - call non-const method for constant object OrdersHandling.mqh 59 41

Почему на первый принт компилятор не ругается, а на второй ругается?

 
  Print("symbol.getName = ", symbol.getName);

1) Скобок нет

2) Если объект передан в метод константной ссылкой (как в вашем коде), то с ним невозможны любые операции, которые могут изменить его.

Компилятор не знает, какие методы можно вызывать в таком случае.

Чтобы явно указать ему, что метод не изменяет объект, нужно в описании метода использовать спецификатор const:

string SymbolProperties::getName() const
{
...
}