C ++设定器不改变变量值

问题描述 投票:0回答:2

我已经包含Restaurant的地图类Order。每个订单都有一个编号。我需要保持如果订单未缴纳或者已经是了。我有可变isPaidOrder类,它是假的defaultly。

Order::pay()应将其更改为真正的方法。这是一种二传手。但是,这是行不通的。在主,你可以看到,它返回0in这两种情况下,但是,在第二种情况下应返回1因为它已经支付。也许有可能调用从餐厅类中的方法,但是,我更愿意通过类似从Order类调用它: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
c++ setter
2个回答
3
投票

成员函数

Order getOrder(int number);

由值返回对象。当你“买单”,如

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

您在单实例的临时副本操作。通过例如在评论由@MatthieuBrucher的建议可以解决这个问题改变函数签名

Order& getOrder(int number);

2
投票

在这一行:

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();
    }
    ...
};
© www.soinside.com 2019 - 2024. All rights reserved.