1

6 つのアイテムを含む在庫をコーディングすると、おそらく次のようになります。

class Inventory {
    private:
        Item[6] m_items;
};

一方、アイテムは次のようになります。

class Item {
    private:
        Inventory* m_parent;
};

ただし、明らかに、両方のクラスがお互いを知ることはできません。1 つの解決策は共通の基本クラスですが、2 つのクラスには共通点がなく、次のような問題がさらに発生します。コンストラクターm_parent->addItem(this);から呼び出すことができません。Item

4

2 に答える 2

5

項目はそれ自体で論理的に完全です。アイテムは、在庫の概念がまったくないシステムでモデル化する価値があります。アイテムが在庫にない場合もあります。モデリングしているアイテムやインベントリの種類によっては、理論的には複数のインベントリに存在する場合もあります。

一方、インベントリは、アイテムを格納するためだけに存在します。現時点ではアイテムが含まれていない可能性がありますが、それ自体がインベントリのコア プロパティです。

上記の考慮事項により、在庫はアイテムの概念と、それが保持する特定のアイテムについて知っている必要があると結論付けました。アイテムは、それがどのインベントリにあるかだけでなく、インベントリの概念にも完全に気付かないように実装する必要があります。

于 2013-05-02T06:39:10.970 に答える
0

私はベンの答えに同意しますが、在庫がアイテムからの変更について知る必要がある場合、またはアイテムが在庫からの追加情報を必要とする場合、これはコールバックによって処理されるべきであることを拡張したいと思います。コールバックはいくつかの方法 (関数ポインター、インターフェイス、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"; 
        }
};    
于 2013-05-02T07:05:40.197 に答える