Hier ist ein Beispiel aus unserer Codebasis. Es wurde vereinfacht, also kann ich nicht garantieren, dass es kompiliert wird, aber es sollte nah sein. Sublokation ist Ihre Klasse A und Slot1 ist Ihre Klasse B. Wir haben eine Anzahl von Slots wie diese, von denen jeder eine andere Teilmenge von Signalen abonniert. Die Vorteile bei der Verwendung dieses Schemas liegen darin, dass die Sublocation nichts über die Slots weiß und die Slots nicht Teil einer Vererbungshierarchie sein müssen und nur Implementierungsfunktionen für die Slots benötigen, die ihnen wichtig sind. Wir verwenden dies, um benutzerdefinierte Funktionalität in unser System mit einer sehr einfachen Schnittstelle hinzuzufügen.
Sublocation.h
class Sublocation
{
public:
typedef boost::signal<void (Time, Time)> ContactSignal;
typedef boost::signal<void()> EndOfSimSignal;
void endOfSim();
void addPerson(Time t, Interactor::Ptr i);
Connection addSignalContact(const ContactSignal::slot_type& slot) const;
Connection addSignalEndOfSim(const EndOfSimSignal::slot_type& slot) const;
private:
mutable ContactSignal fSigContact;
mutable EndOfSimSignal fSigEndOfSim;
};
Sublocation.C
void Sublocation::endOfSim()
{
fSigEndOfSim();
}
Sublocation::Connection Sublocation::addSignalContact(const ContactSignal::slot_type& slot) const
{
return fSigContact.connect(slot);
}
Sublocation::Connection Sublocation::addSignalEndOfSim(const EndOfSimSignal::slot_type& slot) const
{
return fSigEndOfSim.connect(slot);
}
Sublocation::Sublocation()
{
Slot1* slot1 = new Slot1(*this);
Slot2* slot2 = new Slot2(*this);
}
void Sublocation::addPerson(Time t, Interactor::Ptr i)
{
// compute t1
fSigOnContact(t, t1);
// ...
}
Slot1.h
class Slot1
{
public:
Slot1(const Sublocation& subloc);
void onContact(Time t1, Time t2);
void onEndOfSim();
private:
const Sublocation& fSubloc;
};
Slot1.C
Slot1::Slot1(const Sublocation& subloc)
: fSubloc(subloc)
{
subloc.addSignalContact(boost::bind(&Slot1::onContact, this, _1, _2));
subloc.addSignalEndSim(boost::bind(&Slot1::onEndSim, this));
}
void Slot1::onEndOfSim()
{
// ...
}
void Slot1::onContact(Time lastUpdate, Time t)
{
// ...
}
Ist es möglich, eine Funktion zu überlasten, und wenn ja, würde es Ihnen etwas ausmachen, das hinzuzufügen. s.t. Sie haben etwas wie PrintNum (int); und PrintNum (float); – pyInTheSky
@pyInTheSky Verwenden Sie einen Funktionstyp (nicht sicher über den genauen Begriff): '(void (*) (int)) & PrintNum' – Qix