C++ setter 不改变变量值

C++ setter doesn't change variable value

我 class Restaurant 包含 Order 的地图。每个订单都有一个编号。如果订单未支付或已经支付,我需要维护。我在Orderclass中有变量isPaid,默认是false。

方法 Order::pay() 应该将其更改为 true。有点像 setter。但是,它不起作用。在主要情况下,您可以看到,在这两种情况下,它 returns 0,但是,在第二种情况下,应该 return 1 因为它已经支付了。 也许可以从 Restaurant class 调用该方法,但是,我更愿意通过类似以下的方式从 Order class 调用它:restaurant.getOrder(1).pay()

#include <iostream>
#include <map>
#include <iomanip>
#include <string>

using namespace std;

class Order {
    bool isPaid = false;

public:
    bool getIsPaid() {
        return isPaid;
    }

    void pay() {
        isPaid = true;
    }
};

class Restaurant {
    map<int, Order> allOrders;

public:
    void addOrder(int number) {
        Order order = Order();
        allOrders.insert(pair<int, Order>(number, order));
    }

    Order getOrder(int number) {
        return allOrders[number];
    }
};

int main() {
    Restaurant restaurant;
    restaurant.addOrder(1);
    cout << restaurant.getOrder(1).getIsPaid() << endl;
    restaurant.getOrder(1).pay();
    cout << restaurant.getOrder(1).getIsPaid() << endl;
}

结果:

0
0

成员函数

Order getOrder(int number);

returns 对象的值。当你 "pay" 如

restaurant.getOrder(1).pay();
//         ^^^^^^^^^^^ returns a copy

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

Order& getOrder(int number);

这一行:

restaurant.getOrder(1).pay();

restaurant.getOrder(1)returns命令的副本,你在那个副本中设置了bool。考虑重新设计 class,返回对内部结构的引用并不总是一个好主意。像这样你可能会过得更好:

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