C++ C++;setter不';不改变变量值

C++ C++;setter不';不改变变量值,c++,setter,C++,Setter,我有一个类餐厅包含订单地图。每个订单都有编号。如果订单未付款或已付款,我需要维护。在Order类中有变量isPaid,默认为false 方法Order::pay()应将其更改为true。这有点像二传手。但是,它不起作用。大体上,您可以看到,在这两种情况下,它都返回0,但是,在第二种情况下,它应该返回1,因为它已经支付了。 也许可以从Restaurant类调用该方法,但是,我更喜欢从Order类调用它,方法如下:Restaurant.getOrder(1.pay() 成员函数 Order getO

我有一个类
餐厅
包含
订单地图
。每个订单都有编号。如果订单未付款或已付款,我需要维护。在
Order
类中有变量
isPaid
,默认为false

方法
Order::pay()
应将其更改为true。这有点像二传手。但是,它不起作用。大体上,您可以看到,在这两种情况下,它都返回
0
,但是,在第二种情况下,它应该返回
1
,因为它已经支付了。 也许可以从Restaurant类调用该方法,但是,我更喜欢从Order类调用它,方法如下:
Restaurant.getOrder(1.pay()

成员函数

Order getOrder(int number);
按值返回对象。当你“付钱”的时候

您可以对订单实例的临时副本进行操作。您可以按照@MatthieuBrucher在注释中的建议修复此问题,例如将函数签名更改为

Order& getOrder(int number);
成员函数

Order getOrder(int number);
按值返回对象。当你“付钱”的时候

您可以对订单实例的临时副本进行操作。您可以按照@MatthieuBrucher在注释中的建议修复此问题,例如将函数签名更改为

Order& getOrder(int number);
在这方面:

restaurant.getOrder(1).pay();
restaurant.getOrder(1)
返回订单的副本,您可以在该副本中设置
bool
。考虑重新设计你的类,返回你的内部结构的引用并不总是一个好主意。您最好选择这样的方式:

class Restaurant {
    ...
    public: void processPayment(int orderNumber) {
        auto order = allOrders.find(orderNumber);
        if (order == std::end(allOrders)) { throw std::invalid_argument(); }
        order->second.pay();
    }
    ...
};
在这方面:

restaurant.getOrder(1).pay();
restaurant.getOrder(1)
返回订单的副本,您可以在该副本中设置
bool
。考虑重新设计你的类,返回你的内部结构的引用并不总是一个好主意。您最好选择这样的方式:

class Restaurant {
    ...
    public: void processPayment(int orderNumber) {
        auto order = allOrders.find(orderNumber);
        if (order == std::end(allOrders)) { throw std::invalid_argument(); }
        order->second.pay();
    }
    ...
};

您将按顺序返回值,该副本将得到更新。返回一个引用(这里有数千个类似的问题)。您将按顺序返回值,该副本将被更新。返回一个参考(这里有数千个类似的问题)。