0

インスタンス化されたインスタンスがQMap/Mapに格納され、Key:int、value:orderパターンを持つクラスordersがあります。マップを反復処理してクラスの関数にアクセスし始めるまで、すべてがうまくいきました。最初に、たとえば次のgetterメソッドを使用して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]

次に、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
4

1 に答える 1

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();
}
于 2012-09-26T08:52:28.130 に答える