C++ setter 不改变变量值
C++ setter doesn't change variable value
我 class Restaurant
包含 Order
的地图。每个订单都有一个编号。如果订单未支付或已经支付,我需要维护。我在Order
class中有变量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();
}
...
};
我 class Restaurant
包含 Order
的地图。每个订单都有一个编号。如果订单未支付或已经支付,我需要维护。我在Order
class中有变量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();
}
...
};