我已经包含Restaurant
的地图类Order
。每个订单都有一个编号。我需要保持如果订单未缴纳或者已经是了。我有可变isPaid
在Order
类,它是假的defaultly。
Order::pay()
应将其更改为真正的方法。这是一种二传手。但是,这是行不通的。在主,你可以看到,它返回0
in这两种情况下,但是,在第二种情况下应返回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
成员函数
Order getOrder(int number);
由值返回对象。当你“买单”,如
restaurant.getOrder(1).pay();
// ^^^^^^^^^^^ returns a copy
您在单实例的临时副本操作。通过例如在评论由@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();
}
...
};