5

때때로 iOS 및 Mac objective C 프레임 워크로 프로그래밍 한 후 NSNotificationCenter 및 NSNotification 클래스에서 구현 한 일반 알림 패턴을 좋아하게되었습니다. 항상 대부분의 것들을 선택하는 언어였던 C++로 되돌아 왔지만, 나는이 패턴을 복제하려하고 거기에 지원을 제공하는 유사한 C++ 클래스의 일반적인 구현이 실제로 존재해야한다고 생각합니다.C++의 알림 센터

패턴은 나중에 C++보다 구현하기가 다소 어려워 보이지만 더 동적 인 특성 때문에 불가능합니다. 나는 그들이 일반적으로 굉장하고 거기에서 나의 운을 발견하지 않는 것이 슬프던 것에 따라 밀어 올림 도서관을 들여다 보았다. boost :: bind, boost :: lamda, boost :: 함수는 대부분의 작업을 수행하는 것처럼 보입니다. 나는 명백한 것을 놓쳤는가? 이미 NSNotification/NSNotificationCenter 동작을 쉽게 복제 할 수있는 기존의 항목이 있습니까?

+0

Boost.signals를 사용해 보셨나요? – anno

+0

제게 제안 해 주셔서 감사합니다. – jbat100

+0

약간 다른 접근 방식을 사용하는 Qt는 전용 전처리 도구 (mock <-> 메타 오브젝트 컴파일러)를 통해 "신호와 슬롯"을 구현했습니다. 그러나, 귀하의 필요에 맞는 경우에만 사용하는 것이 합리적입니다. –

답변

1

@ 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에 전달 된 추적 가능 객체 에 대한 포인터 또는 참조가 발견되고 추적됩니다.

2

이론적으로 특정 알림이 호출 될 때 호출 할 함수 포인터 벡터가있는 클래스를 만들 수 있습니다. - 개체가 알림을 푸시 할 때 호출 할 함수의 벡터 인 사전이있는 클래스

2

다른 답변에서 언급 된 boost 패키지 외에도 다른 옵션은 poco::NotificationCenter입니다. 특별히 포코의 documentation 논의

이 구현은 코코아 알림 프레임 워크에 가까운 :

NotificationCenter 클래스는 기본적으로 애플의 코코아 (또는 오픈 스텝)에있는 NSNotificationCenter 클래스의 C++ 구현입니다.