карта — c ++ Qt постоянное нарушение?

У меня есть класс заказов, чей экземпляр хранится в 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

0

Решение

QMap :: значение () возвращает const T, поэтому вы не можете вызывать не константные функции-члены на нем. Кроме того, он возвращает копия объекта на карте, поэтому вызов сеттера не будет делать то, что вы думаете, и объект на карте не изменится. Единственная функция-член, которая возвращает ссылку operator[], но имейте в виду, что сначала вам нужно проверить, содержит ли карта ключ с contains(), так как operator[]добавит его на карту.

Или вы можете использовать итератор для доступа к элементу и его изменения.

QMap<int, order>::iterator it = orderSet.find(i);
if (it != orderSet.end()) {
// Found it
it->callSetter();
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]