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();
}
...
};
您将按顺序返回值,该副本将得到更新。返回一个引用(这里有数千个类似的问题)。您将按顺序返回值,该副本将被更新。返回一个参考(这里有数千个类似的问题)。