プログラミングのミスを避けるために、特定の種類のオブジェクトのライフ サイクル (新規/削除) を制御するコンテナーを作成しました。たとえば、コンテナに通知することなくオブジェクトが削除されます。オブジェクトは同じ基本クラス (GreetingBase) から継承します。
実装には、「テンプレート トリック」を使用しています。
class GreetingBase{
public:
virtual void sayHello(){
std::cout << "Hello there!" << endl;
}
virtual ~GreetingBase(){}
};
class GreetingDerived: public GreetingBase{
public:
virtual void sayHello(){
std::cout << "Hola amigos!" << endl;
}
virtual ~GreetingDerived(){}
};
class GreetingContainer{
public:
template <class T>
void addClass(){
items.push_back(new T());
}
~GreetingContainer(){
for(std::vector<GreetingBase*>::iterator it = items.begin();
it < items.end(); it++ ){
delete *it;
}
}
void talk(){
for(std::vector<GreetingBase*>::iterator it = items.begin();
it < items.end(); it++ ){
(*it)->sayHello();
}
}
private:
std::vector<GreetingBase*> items;
};
int main(){
GreetingContainer container;
container.addClass<GreetingDerived>();
container.talk();
return 0;
}
質問:
- この問題を解決するためにテンプレートを使用することは一般的なアプローチですか? 欠点はありますか?
- 「T」が「GreetingBase」から派生していない場合に、より適切なエラー メッセージを報告する「標準的な方法」
前もって感謝します。