c ++ Qt常量违规?

时间:2012-09-26 07:52:12

标签: c++ map const qmap

我有一个类命令,它的实例存储在QMap / Map中,并且有一个Key:int,value:order pattern。一切顺利,直到我开始遍历地图并访问类的功能。首先,我尝试使用它的getter方法打印出订单对象值 例如:

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]

然后我通过向getter方法添加'const'来修复此问题,并且前一行代码将成功运行并打印出对象日期为字符串。

然而现在问题是我无法实现我的setter方法,因为我会得到相同的错误,显然setter方法有一行改变原始成员变量,所以这本身就违反了常量规则,所以我怎么能改变地图中的对象变量??

如果有帮助的话,继承我的代码:

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

1 个答案:

答案 0 :(得分:1)

QMap::value()返回const T,因此您无法在其上调用非const成员函数。此外,它返回地图中对象的副本,因此调用setter不会按照您的想法执行,并且地图中的对象将保持不变。返回引用的唯一成员函数是operator[],但请记住,您首先需要检查地图是否包含contains()的密钥,因为operator[]会将其添加到地图中

或者,您可以使用迭代器来访问项目并进行修改。

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