当一个类的对象成员需要访问彼此的数据时该怎么办?

时间:2012-05-24 09:14:30

标签: c++ object composition

我有一个简单的Store类,其中包含Inventory个对象和CashRegister个对象。为了销售商品,CashRegister对象需要访问Inventory对象的方法;即那些返回特定项目的价格,存储中的数量等的那些。什么是让CashRegister对象访问Inventory对象方法的最佳方法?

谢谢。

4 个答案:

答案 0 :(得分:3)

  

CashRegister对象需要访问Inventory对象的方法

为什么呢? CashRegister可以存在并且在没有Inventory的情况下完美运行。您可以在剧院或电影院中拥有CashRegister,而不仅仅是Store。你所谈论的这部分逻辑应该是商店的一部分。

class Store
{
   CashRegister register;
   Inventory I;
   void sellSomething(Item i)
   {
      //move logic inside the store
      //not in CashRegister
      int price = I.getPrice(i);
      register.addCash(price);
      I.removeItem(i);
   }
};

答案 1 :(得分:3)

一种解决方案是在Inventory对象中存储对CashRegister对象的引用,并在构造Store对象时提供引用。

class Inventory { /* ... */ };

class CashRegister
{
public:
    CashRegister(Inventory &inventory)
        : inventory_(inventory)
    { }

    // ....

private:
    Inventory &inventory_;
};

class Store
{
public:
    Store()
        : cashregister_(inventory_)
    { }

    // ....

private:
    Inventory inventory_;
    CashRegister cashregister_;
};

答案 2 :(得分:1)

class Inventory {
  Currency price;
  uint64_t quantity;
  public:
    Currency get_price() { return price; }
    uint64_t get_quantity() { return quantity; }
};

然后您的收银机可以调用Inventory

的实例上的功能

但实际上,您应该在Inventory上设置一个功能来保留或提供一定数量的对象(如果可用) - 收银机需要知道有多少物品在库存,只需知道当前的需求是否可以满足。就此而言,我不确定Inventory是否需要知道某个对象的价格 - 如果周三下午有10%的折扣,那么该仓库的业务是什么?

答案 3 :(得分:1)

赋予对象责任,不要只使用它们来聚集数据。

Inventory应该知道如何添加和删除Item。可能需要进行交易。这个赋值是数据库的隐喻。

@Luchian有正确的想法,但我会更进一步。

您希望Inventory(数据库)能够处理Transaction,在这种情况下,专门用于使用收银机。

Item应该能够代表Inventory

查看Tell Don't AskWrite No Getters的想法。