fa.'s answer एक अच्छी शुरुआत है: तो फिर तुम एक स्वामित्व विधि सूचक के अंदर उपलब्ध हो सकता है। हालांकि, यह एक ही प्रकार के एकाधिक मालिकों की समस्या का समाधान नहीं करता है। एक समाधान यह है कि नोटिफ़ायर को एक के बजाय मालिकों की एक सूची स्टोर करना है।
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()) { }
};
मामले ऐसे हैं जिनमें मालिकों के विभिन्न प्रकार है, यह समाधान नहीं बल्कि मुश्किल हो सकता है उपयोग करने के लिए। होगा इस समाधान को लागू करने
class Owned : public Notifier<Owned, OwnerType1, OwnerType1, OwnerType2>
{
Owned(OwnerType1 & o1, OwnerType1 & o2, OwnerType2 & o3)
: base(o1,o2,o3)
};
हालांकि, इस मामले में, आप को बढ़ावा देने metaprogramming पुस्तकालयों (MPL, Fusion), जिसके साथ आप एक कोड आप ऐसा सामान करते हैं कि लग सकती है को देखने के लिए चाहते हो सकता है पिछले एक से थोड़ा लंबा हो।
स्रोत
2009-04-02 15:35:48
क्या आपको स्थैतिक बहुरूपता की आवश्यकता है या आप एक अमूर्त बेस क्लास IOwner बना सकते हैं उदा। शुद्ध वर्चुअल विधि 'सूचित करें'? –
नहीं, मेरे पास शुद्ध आभासी 'अधिसूचना' नहीं हो सकती है। –