C ++ setter不会更改变量值

时间:2019-02-04 14:41:11

标签: c++ setter

我有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

2 个答案:

答案 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