У меня есть класс заказов, чей экземпляр хранится в QMap / Map и имеет шаблон Key: int, value: order. Все шло хорошо, пока я не начал итерацию по карте и доступ к функциям класса. Сначала я пытался распечатать значения объектов порядка, используя его методы получения.
например:
orderSet.value(i).getDate().toString("dd/MM/yyyy");
//OrderSet is my map
Это однако произвело ошибку
error: passing 'const order' as 'this' argument of 'QDate order::getDate()' discards qualifiers [-fpermissive]
Затем я исправил это, добавив const к методам получения, и предыдущая строка кода успешно запустилась и распечатала дату этого объекта в виде строки.
Однако теперь проблема в том, что я не могу реализовать свои методы сеттера, потому что я получу ту же ошибку, и, очевидно, у метода сеттера есть строка, которая изменяет исходную переменную-член, так что это само по себе нарушит правило константы, так как я могу изменить объект переменные в карте ??
вот мой код, если это поможет:
class order
{
QDate dateOrdered;
int totOrders;
double totValue;
public:
order();
order(QDate,int,double);
//Sets
void setDate(QDate); //Cant add const since values are being altered
void setOrderTot(int);
void setValueTot(double);
//Gets
QDate getDate() const; //Adding const solved these methods
int getOrderTot()const;
double getValueTot()const;
};
#endif // ORDER_H
QMap :: значение () возвращает const T
, поэтому вы не можете вызывать не константные функции-члены на нем. Кроме того, он возвращает копия объекта на карте, поэтому вызов сеттера не будет делать то, что вы думаете, и объект на карте не изменится. Единственная функция-член, которая возвращает ссылку operator[]
, но имейте в виду, что сначала вам нужно проверить, содержит ли карта ключ с contains()
, так как operator[]
добавит его на карту.
Или вы можете использовать итератор для доступа к элементу и его изменения.
QMap<int, order>::iterator it = orderSet.find(i);
if (it != orderSet.end()) {
// Found it
it->callSetter();
}
Других решений пока нет …