最も単純な構造のクラスComponent
と があるLeaf : Component
としComposite : Component
ます。Leaf
クラスの各オブジェクトにはint id
、そのアイデンティティを与える があります。複合クラスには、次のような sth があります。
class Composite : public Component
{
public:
void removeComponent(Component*);
// other stuff
private:
std::vector<Component*> coll;
};
そしてリーフクラスは次のようになります:
class Leaf : public Component
{
public:
//stuff
int getID();
private:
int id;
};
問題は、関数をどのように定義するかremoveComponent(Component* cmp)
です。cmp は実際には ですが、ベクトル collLeaf
にアクセスする必要があるため、 (だと思います) である必要があります。removeComponent メソッドはオブジェクトを受け取り、構造全体から同じ ID を持つ他のすべての葉を削除します。Component
Component
Leaf
今、私は2つの方法を考えました(どちらも機能しません:P):
初め
void Composide::removeComponent(Component* cmp)
{
std::vector<Component*>::const_iterator it;
for(it = coll.begin(); it != coll.end(); ++it)
{
(*it)->removeComponent(cmp);
// where removeComponent is defined as virtual in Component, but
// the problem is that Leaf cannot erase itself from the collection
}
}
2番
void Composide::removeComponent(Component* cmp)
{
std::vector<Component*>::const_iterator it;
for(it = coll.begin(); it != coll.end(); ++it)
{
if((*it)->equals(*cmp))
it = erase(it);
// But here I can't define equals function for Composite elements,
// so then I'd have to make functions which return the type of Component,
// and in case of Composite call recursively the function and
// in the case of Leaf call the equals() function and erase if needed.
// This however looks like really bad OOP practice, and I'd like to avoid
// using those methods which return type..
}
}
これを行うには、きちんとした適切な方法が必要です。メソッドは上記の最初の方法のように見えるはずだと思いますがLeaf
、ベクターから自分自身を削除できるようにする方法が本当にわかりません。お願い助けて?:)