fa.'s answerは良いスタートです。ただし、同じタイプの複数の所有者がいるという問題は解決しません。 1つの解決策は、通知者に単一のものの代わりに所有者のリストを格納させることである。ここでの考え方を示すように、迅速な実装です:
template <typename Owner, typename Owned>
class Notifier
{
protected:
Notifier()
{}
// Constructor taking a single owner
Notifier(Owner & o)
{
owners.push_back(&o);
}
// Constructor taking a range of owners
template <typename InputIterator>
Notifier(InputIterator firstOwner, InputIterator lastOwner)
: owners(firstOwner, lastOwner) {}
~Notifier()
{
OwnerList::const_iterator it = owners.begin();
OwnerList::const_iterator end = owners.end();
for (; it != end ; ++it)
{
(*it)->notify(static_cast<Owned*>(this));
}
}
// Method for adding a new owner
void addOwner(Owner & o)
{
owners.push_back(&o);
}
private:
typedef std::vector<Owner *> OwnerList;
OwnerList owners;
};
あなたはそれをこのように使用することができます。
class Owner;
class Owned : public Notifier<Owner, Owned>
{
typedef Notifier<Owner, Owned> base;
//Some possible constructors:
Owned(Owner & o) : base(o) { }
Owned(Owner & o1, Owner & o2)
{
base::addOwner(o1); //qualified call of base::addOwner
base::addOwner(o2); //in case there are other bases
}
Owned(std::list<Owner*> lo) : base(lo.begin(), lo.end()) { }
};
あなたが所有者の多くの異なる種類を持っている場合は、このソリューションはかなり困難になることができます使用する。この場合、あなたはあなたがそのような原料をやらせるコードで終わる可能性があるとブーストメタプログラミングライブラリ(MPL、Fusion)、見たいかもしれません:
class Owned : public Notifier<Owned, OwnerType1, OwnerType1, OwnerType2>
{
Owned(OwnerType1 & o1, OwnerType1 & o2, OwnerType2 & o3)
: base(o1,o2,o3)
};
しかし、このソリューションを実装するだろう以前のものより少し長くなります。
静的多型が必要か、抽象基底クラスIOwnerを例えば以下のように作成できますか?純粋な仮想メソッド 'notify'? –
いいえ、私は純粋な仮想 'notify'を持つことはできません。 –