C++ 项目-库存-关系,哪一个应该知道另一个?

C++ 项目-库存-关系,哪一个应该知道另一个?,c++,class,design-patterns,C++,Class,Design Patterns,编码一个可以包含6个项目的库存可能如下所示: class Inventory { private: Item[6] m_items; }; class Item { private: Inventory* m_parent; }; 另一方面,一个项目看起来是这样的: class Inventory { private: Item[6] m_items; }; class Item { private:

编码一个可以包含6个项目的库存可能如下所示:

class Inventory {
    private:
        Item[6] m_items;
};
class Item {
    private:
        Inventory* m_parent;
};
另一方面,一个项目看起来是这样的:

class Inventory {
    private:
        Item[6] m_items;
};
class Item {
    private:
        Inventory* m_parent;
};
然而,很明显,这两个类不可能相互了解。
一种解决方案是一个公共基类,但这两个类没有任何共同之处,这将导致更多问题,例如:我将无法调用
m_parent->addItem(this)来自
项的构造函数。

项本身在逻辑上是完整的。在一个根本没有库存概念的系统中,物品是值得建模的。一个项目甚至可能不在库存中。理论上,它甚至可能存在于多个库存中,这取决于您正在建模的项目和库存的类型

另一方面,存货的存在仅仅是为了存放物品。它目前可能没有任何项目,但这本身就是库存的核心属性


基于以上考虑,我得出结论,存货应了解项目的概念及其持有的特定项目。而项目的实施不仅应完全忽略其所处的库存,还应完全忽略库存的概念。

项目本身在逻辑上是完整的。在一个根本没有库存概念的系统中,物品是值得建模的。一个项目甚至可能不在库存中。理论上,它甚至可能存在于多个库存中,这取决于您正在建模的项目和库存的类型

另一方面,存货的存在仅仅是为了存放物品。它目前可能没有任何项目,但这本身就是库存的核心属性


基于以上考虑,我得出结论,存货应了解项目的概念及其持有的特定项目。虽然项目的实施不仅应完全忽略其所处的库存,还应完全忽略库存的概念。

我同意Ben的回答,但我想在库存需要了解项目的变化或项目是否需要库存中的额外信息时扩展这一点,这应该通过回调来处理。回调可以通过几种方式实现(函数指针、接口、std::function、signal/slot等等),但主要的是:项目不知道库存

例如:

class CallbackInterface {
    public:
        virtual void itemChanged() = 0;
};

class Item {
    public:
        Item(CallbackInterface* callback): m_callback(callback) { }
    private:
        CallbackInterface* m_callback;
};

class Inventory: public CallbackInterface {
    private:
        Item[6] m_items;
        virtual void itemChanged() {
            std::cout << "item has changed"; 
        }
};    
类回调接口{
公众:
虚拟void itemChanged()=0;
};
类项目{
公众:
项(回调接口*回调):m_回调(回调){}
私人:
回调接口*m_回调;
};
类清单:公共回调接口{
私人:
项目[6]m_项目;
虚拟void itemChanged(){

std::cout我同意Ben的回答,但我想扩展一下,当库存需要了解项目的变化或者项目需要库存中的一些额外信息时,应该通过回调来处理。回调可以通过几种方式实现(函数指针、接口、std::函数、信号/插槽等),但最重要的是:物品不知道库存

例如:

class CallbackInterface {
    public:
        virtual void itemChanged() = 0;
};

class Item {
    public:
        Item(CallbackInterface* callback): m_callback(callback) { }
    private:
        CallbackInterface* m_callback;
};

class Inventory: public CallbackInterface {
    private:
        Item[6] m_items;
        virtual void itemChanged() {
            std::cout << "item has changed"; 
        }
};    
类回调接口{
公众:
虚拟void itemChanged()=0;
};
类项目{
公众:
项(回调接口*回调):m_回调(回调){}
私人:
回调接口*m_回调;
};
类清单:公共回调接口{
私人:
项目[6]m_项目;
虚拟void itemChanged(){

显然,两个类不能相互了解.确切的原因是什么?为什么很明显?我认为什么成分才是正确的方法。因为
库存
有一个`
项目
关系存在。而
项目
是一个
库存
是不正确的。你可能想在
项目
中添加一个指向
库存
的指针,但也许你可以通过使用self code>来解决这个问题-
存货的定义名称
objects@Nawaz这将在两个文件之间创建一个无限的include循环。此外,类层次结构也将变得复杂,想象一个只包含
s的存储,包括
的存储也将包括
库存
,而这在存储中是不需要的。@SkamahOne:不,它不会创建无限包含循环。搜索“类的前向声明”或“类和前向声明”,等等。问题是,为什么你认为
显然应该知道
库存
?这一点都不明显,事实上这是完全违反直觉的。“显然,这两个阶层不可能相互了解。".确切的原因是什么?为什么很明显?我认为什么成分才是正确的方法。因为
库存
有一个`
项目
关系存在。而
项目
是一个
库存
是不正确的。你可能想在
项目
中添加一个指向
库存
的指针,但也许你可以通过使用self code>来解决这个问题-
存货的定义名称
objects@Nawaz这将在两个文件之间创建一个无限的include循环。此外,类层次结构也将变得复杂,想象一个只包含
s的存储,包括
的存储也将包括
库存
,而这在存储中是不需要的。@SkamahOne:不,它不会创建无限包含循环。搜索“类的转发声明”或“类和转发声明”问题是,为什么你认为
项目
显然应该知道
库存
?这一点都不明显,事实上这是违反直觉的。多亏了这些评论,我才明白了这一点,但多亏了你的回答和进一步解释:)多亏了这些评论,我才明白这一点,但多亏了f或者你的回答和进一步的解释