脱離およびC ++のソースコードを達成するための23個のデザインパターン-GoFファインパターンの設計ソリューション:以下のソースコード
//Component.h
#pragmaかつて クラスコンポーネント { 公共: 成分(); 仮想〜コンポーネント(); 仮想 空オペレーション()= 0 ; 仮想 空(追加のconstコンポーネント&); 仮想 無効(削除のconstコンポーネント&); 仮想コンポーネント*でGetChild(INT ); 保護: プライベート: }。
//Component.cpp
#include " Component.h " 成分::成分(){} コンポーネント::〜コンポーネント(){} のボイド(コンポーネント::追加のconstコンポーネント&COM){} のボイド(コンポーネント::削除のconstコンポーネント&COM){} コンポーネント *コンポーネント::でGetChild(int型のインデックス) { リターン 0 ; }
//composite.h
#include " Component.h " の#include <ベクトル> クラスコンポジット:公共のコンポーネント { 公共: 複合(); 仮想〜コンポジット(); 空の追加(コンポーネント* COM)。 空の削除(コンポーネント* COM)。 無効操作(); コンポーネント *でGetChild(int型のインデックス); 保護: プライベート: std ::ベクトル <コンポーネント*> comVec。 }。
//Composite.cpp
#include " Component.h " の#include " composite.h " const int型 はnull = 0 ; 複合::複合(){} 複合::〜複合(){} 空コンポジット::オペレーション(){ のため(のstd ::ベクトル<コンポーネント*> ::イテレータ仲間comVec.begin =();!数= comVec.end(); ++ の仲間) { (アールズ) - > オペレーション(); } } 空コンポジット::追加(コンポーネント* COM) { comVec.push_back(COM)。 } 空コンポジット::削除(コンポーネント* COM) { // comVec.erase(&COM); // ここでの問題を説明しようとしている、そこにあります!!! } コンポーネント *コンポジット::でGetChild(int型のインデックス) { リターンcomVec [インデックス]。 }
//Leaf.h
#include 「Component.h 」 クラスリーフ:公共のコンポーネント { 公共: 葉(); 仮想〜リーフ(); 無効操作(); 保護: プライベート: }。
//Leaf.cpp
#include " Leaf.h " の#include <iostreamの> 葉::葉(){ } リーフ::〜リーフ(){} 無効リーフ::オペレーション(){ std :: coutの << " リーフ操作... " << はstd ::てendl; }
//main.cpp
#include " Component.h " の#include " composite.h " の#include " Leaf.h " の#include <iostreamの> の#include < 文字列 > int型のmain(int型の引数、文字 * ARGV) { リーフ * I = 新しいリーフ(); I - > オペレーション(); コンポジット * COM = 新しいコンポジット(); コム - > (I)を追加します。 コム - > オペレーション(); 成分 * II = COM - >でGetChild(0 )。 getchar(); リターン 0 ; }