我有Restaurant
类,其中包含Order
的地图。每个订单都有一个数字。如果订单未付款或已经付款,我需要维护。我在isPaid
类中有变量Order
,默认情况下为false。
方法Order::pay()
应该将其更改为true。这是二传手。但是,它不起作用。在主要情况下,您可以看到,在两种情况下它都返回0
,但是在第二种情况下,应该已经返回1
。
也许可以从Restaurant类中调用该方法,但是,我更喜欢从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
答案 0 :(得分:3)
成员函数
Order getOrder(int number);
按值返回对象。当您按照“付款方式”
restaurant.getOrder(1).pay();
// ^^^^^^^^^^^ returns a copy
您对订单实例的临时副本进行操作。您可以按照@MatthieuBrucher在注释中的建议来解决此问题,例如将功能签名更改为
Order& getOrder(int number);
答案 1 :(得分:2)
在这一行:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script>
function prose(name, company) {
this.name = name,
this.company = company,
this.rate = 0
}
var y = new prose("JavaScript", "Packet Publishing");
y.rate = 30;
document.write("The name of the book is " + y.name + "<br>");
document.write("The name of the publishing company is : " + y.company + "<br>");
document.write("The cost of the book is $" + y.rate + "<br>");
</script>
<!--Ejemplo 5
<a href="javascript:PacktPub()">Click Here</a> -->
</body>
</html>
restaurant.getOrder(1).pay();
返回订单的副本,您在该副本中设置了restaurant.getOrder(1)
。考虑重新设计类,返回对内部的引用并不总是一个好主意。像这样您可能会更好:
bool