@ anno는 boot :: signal을 살펴보기 위해 권장하는대로 예상 한대로 객관적인 C 솔루션과 같이 간단하지는 않지만 조사한 후에 가능한 옵션처럼 보입니다. boost::signal tutorial을 살펴보면 문제의 가장 관련성이 높은 부분을 직접 살펴볼 것이라고 생각했습니다.
는 알림 보낸 사람을 만들려면 :
클라이언트가 정보가 도착하는대로 모든 연결된 클라이언트에 뉴스를 전송하는 뉴스 공급자에 연결하는 간단한 뉴스 배달 서비스를 고려하십시오. 뉴스 배달 서비스는 다음과 같이 구성 될 수있다 :
는
class NewsItem { /* ... */ };
boost::signal<void (const NewsItem&)> deliverNews;
deliverNews
의 목적은 NewsItem
가 생성 된 것을 관측을 알려 드리고자합니다.
관찰자 (부스트 : : 바인드 라이브러리 사용) 다음과 같이 추가 할 수 있습니다
클라이언트 뉴스 업데이트를 수신 할 경우에만 deliverNews에 뉴스 항목을받을 수있는 함수 객체를 연결해야합니다 신호. 예를 들어, 우리는, 예를 들면은, :
struct NewsMessageArea : public MessageArea
{
public:
// ...
void displayNews(const NewsItem& news) const
{
messageText = news.text();
update();
}
};
// ...
NewsMessageArea newsMessageArea = new NewsMessageArea(/* ... */);
// ...
deliverNews.connect(boost::bind(&NewsMessageArea::displayNews, newsMessageArea, _1));
목록에서 해제 된 관찰자를 제거하는 문제를 해결하기 위해, 부스트 뉴스를 위해 특별히 우리의 응용 프로그램에서 특별한 메시지 영역이있을 수 있습니다 :: 신호는
그러나 다음과 같은 솔루션을 제공, 어떤 사용자가 deliverNews에 대해 알고있는 newsMessageArea 오브젝트를 파괴하고, 뉴스 메시지 영역을 닫으면? 대부분 세그먼트 화 오류가 발생합니다. 그러나 Boost.Signals를 사용하려면 만 NewsMessageArea를 추적 가능해야하며 newsMessageArea가 인 경우 newsMessageArea와 관련된 슬롯의 연결이 끊어집니다.추적 가능한 개체의 사용에 상당한 제한이
struct NewsMessageArea : public MessageArea, public boost::signals::trackable
{
// ...
};
이 때 다음 NewsMessageArea 클래스는 부스트 :: 신호 :: 추적 가능한 클래스, 예로부터 공개적으로 를 유도하여 추적이 구성되어 슬롯 연결 만들기 : Boost.Bind를 사용하여 빌드 된 함수 객체가 이해되어 boost :: bind에 전달 된 추적 가능 객체 에 대한 포인터 또는 참조가 발견되고 추적됩니다.
Boost.signals를 사용해 보셨나요? – anno
제게 제안 해 주셔서 감사합니다. – jbat100
약간 다른 접근 방식을 사용하는 Qt는 전용 전처리 도구 (mock <-> 메타 오브젝트 컴파일러)를 통해 "신호와 슬롯"을 구현했습니다. 그러나, 귀하의 필요에 맞는 경우에만 사용하는 것이 합리적입니다. –