Dưới đây là ví dụ từ codebase của chúng tôi. Nó đã được đơn giản hóa, vì vậy tôi không guarentee rằng nó sẽ biên dịch, nhưng nó phải gần gũi. Phân bổ lại là lớp A của bạn, và Slot1 là lớp B. Chúng tôi có một số các khe như thế này, mỗi vị trí đăng ký một tập con khác nhau của các tín hiệu. Ưu điểm của việc sử dụng lược đồ này là Sublocation không biết gì về bất kỳ slot nào và các slot không cần phải là một phần của bất kỳ hệ thống phân cấp thừa kế nào và chỉ cần thực hiện chức năng cho các slot mà chúng quan tâm. Chúng tôi sử dụng tính năng này để thêm chức năng tùy chỉnh vào hệ thống của chúng tôi với giao diện rất đơn giản.
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)
{
// ...
}
Có thể quá tải một chức năng không, và nếu có, bạn có thể thêm vào đó không. s.t. bạn có một cái gì đó như PrintNum (int); và PrintNum (phao); – pyInTheSky
@pyInTheSky Sử dụng một loại hàm (không chắc chắn về thuật ngữ chính xác): '(void (*) (int)) & PrintNum' – Qix