オブジェクトの階層を超える関数呼び出しは、中間層のオブジェクトにラッパ関数を追加することで結合を解く。
//HigherLayer.h class MiddleLayer; class UpperLayer { private: MiddleLayer* m_pMiddle; public: HigherLayer(MiddleLayer* pMiddle) : m_pMiddle(pMiddle) {}; void operation(void); }; //HigherLayer.cpp #include "MiddleLayer.h" #include "LowerLayer.h" //インクルードが必要 void HigherLayer::operation(void) { m_pMiddle->getLower()->call(); // Lowerの関数呼び出す }
//MiddleLayer.h class LowerLayer; class MiddleLayer { private: LowerLayer* m_pLower; public: MiddleLayer(LowerLayer* pLower) : m_pLower(pLower) {}; LowerLayer* getLower(void); }; //MiddleLayer.cpp #include "LowerLayer.h" LowerLayer* MiddleLayer::getLower(void) { return m_pLower; };
//LowerLayer.h class LowerLayer { public: void call(void); };
これを
//HigherLayer.h class HigherLayer{ private: MiddleLayer* m_pMiddle; public: HigherLayer(MiddleLayer* pMiddle) : m_pMiddle(pMiddle) {}; void operation(void) { m_pMiddle->call(); }; }; //HigherLayer.cpp #include "MiddleLayer.h" /* #include "LowerLayer.h" インクルード不要 */ void HigherLayer::operation(void) { m_pMiddle->call(); };
//MiddleLayer.h class LowerLayer; class MiddleLayer { private: LowerLayer* m_pLower; public: MiddleLayer(LowerLayer* pLower) : m_pLower(pLower) {}; void call(void); }; //MiddleLayer.cpp #include "LowerLayer.h" void MiddleLayer::call(void) { m_pLower->call(); };
//LowerLayer.h class LowerLayer { public: void call(void); };
こうする。