2010-06-13 3 views
7

내가 다음 ViewB 인터페이스에C++에는 이벤트/위임자/인터페이스/알림이 있습니다! 아무것도?

@protocol ViewBDelegate{ 

- (void) doSomething(); 
} 

을 할 수있는 내가 ViewA하고 객관적인 C에서 ViewB

이 위임 패턴을 사용하여 이러한 클래스를 가지고 말 :

id<ViewBDelegate> delegate; 

다음 ViewA 구현에 내가 설정 대의원 :

viewB.delegate = self; 

이제 viewB에서 doSomething을 알 수없는 형식의 대리자로 호출 할 수 있습니다.

[delegate doSomething]; 

"C++ 프로그래밍 방법"이 더 나 빠졌고 기본 디자인 패턴을 보여주는 간단한 예제를 찾을 수 없습니다.

내가 뭘 C++에서 찾고 있어요 것은 :

  • 이벤트 액션 스크립트와 자바
  • 또는 목표 C에서 대의원 또는 NSNotifications

클래스 A를 할 수 있습니다 무엇이든, 클래스 B ClassX가 그걸 알기 위해 클래스 C didSomething() !!!

감사합니다.

답변

9

내가 당신이라면이 작업을 수행하는 데 함수 포인터를 사용하지 않을 것입니다.)

Boost에는 signals이라는 멋진 라이브러리가 있습니다. 그것은 당신의 인생을 더 쉽게 만듭니다! 이 인쇄됩니다

#include <iostream> 
#include <boost/bind.hpp> 
#include <boost/signal.hpp> 
using namespace std; 
using namespace boost; 

struct A 
{ void A_action() { cout << "A::A_action();" << endl; } }; 
struct B 
{ void B_action() { cout << "B::B_action();" << endl; } }; 
struct C 
{ void C_action() { cout << "C::C_action();" << endl; } }; 
struct X 
{ 
    // Put all the functions you want to notify! 
    signal<void()> list_of_actions; 
    void do_something() 
    { 
     std::cout << "Hello I am X!" << endl; 
     list_of_actions(); // send notifications to all functions in the list! 
    } 
}; 
int main() 
{ 
    X x; 
    A a; 
    B b; 
    C c; 
    x.list_of_actions.connect(bind(&A::A_action, a)); 
    x.list_of_actions.connect(bind(&B::B_action, b)); 
    x.list_of_actions.connect(bind(&C::C_action, c)); 
    x.do_something(); 
} 

: 그것이 작동하는 방법

다음
Hello I am X! 
A::A_action(); 
B::B_action(); 
C::C_action(); 

인이 사용의 예입니다.

signal<void()> list_of_actions; 

그런 다음 통화 할 기능/펑/호출 것들을 무엇을 적 그룹에 "연결"

첫째, 당신은 대의원을 보유하고 장소를 선언합니다.

x.list_of_actions.connect(bind(&A::A_action, a)); 
x.list_of_actions.connect(bind(&B::B_action, b)); 
x.list_of_actions.connect(bind(&C::C_action, c)); 

참고로 bind을 사용했습니다. 따라서 list_of_actions에있는 함수 유형은 동일하지만 다른 유형의 클래스에 연결할 수 있습니다. 그래서 : 우리가 이전에 list_of actions의 유형을 선언

bind(&A::A_action, a) 

이 점은 입력 void()의, 호출 가능한 일을 생성합니다. 물론이 멤버 함수를 적용 할 인스턴스를 두 번째 매개 변수로 지정하십시오.

멀티 스레드 작업을 수행하는 경우 자매 인 signals2을 사용하십시오.

희망이 있습니다.

+0

시간을내어 예제를 추가해 주신 Arak에게 감사드립니다. 그게 내 수색을 끝내. 훌륭한! – Bach

+0

멋진 답변입니다. – Ross

2

대리인/이벤트/등은 없습니다.

순수 가상 함수를 사용하여 인터페이스를 시뮬레이트 할 수 있습니다. 비슷한 질문은 here을 참조하십시오.

그리고 function pointers있다 ...

그래서 기본적으로 당신이 질문에 대한 대답은 아니, C에서 그 어느 것도 없다됩니다 ++ (최신 표준에 대해 알고하지 않습니다)하지만, 대체 및 해결 방법이 있습니다 ..

+0

감사해야 할 인터페이스 구현을 확인합니다. – Bach

1

C++ 언어 나 관련 표준 라이브러리에는 대리자 나 이벤트가 없습니다. 물론 그러한 것들을 구현하는 많은 라이브러리가 있거나 직접 구현할 수 있습니다.

+0

감사합니다. 정말 언어를 배우는 것이 어렵다는 것을 알았습니다. 저는 Objective C와 python이 얼마나 망가질 수 있는지 깨달았습니다. – Bach

+2

@Bach 어떤 언어를 배울 때, 아는 다른 언어에서 밈을 옮기지 않으시는 것이 중요합니다. C++은 실제로 Python과 같은 것이 아닙니다. Objective C에 관해서는 말할 수 없습니다. C++에서 위임을 할 수 있습니다. 언어의 일부는 아닙니다. –

+0

Neil에 동의합니다. 내가하고 싶은 것을 정확히 알고 있기 때문에 Neil이 도움이 될 수는 없지만, 다른 언어로 어떻게 처리되었는지 살펴 봅니다. 따라서 C++에서 동등한 것을 자연스럽게 찾으려고 노력합니다. 내가 발견하고 배우는 모든 부분. 여기에서 모든 제안을 확인합니다. Stackoverflow 내가 어떤 언어에 대한, 유익하고 전문가의 전체에 대해 읽은 책을 맞았다. 모두에게 감사드립니다. – Bach

1

나는 모두 콜백 메서드 (실제로는 함수 포인터)라는 메서드 유형이 있다는 것을 알고 있습니다.

위임? 그냥 포장 콜백 방법의 종류, 그리고 알고 클래스 A를 할 수 있습니다

+0

감사합니다 rhapsodyn. 나는 내가 당연한 것으로 전진했다고 생각한다. 어쨌든 도움을 주신 것에 대해 객관적인 C에서 오는 C++에 대해서는 우아하지 않습니다. – Bach

5

아무것도, 클래스 B 및 클래스 C를 고급 보이는 ClassX didSomething 그()!

아마 여러 구현이있는, signals & slots를 찾고 있습니다 :

좀 더 거기에 확신하지만, 이들의 가장 중요 나는 알고있다.

1

"어떻게 프로그램으로 C는 ++"는 나쁘게 기본 디자인 패턴

내가 the original Design Patterns book은 C++을 사용하여 각 패턴을 구현하는 방법의 예를 포함하는 생각을 보여주는 간단한 예제를 찾을 수 없습니다 읽을 수있다.

2

개인적으로 나는 Sergey Ryazanov가 The Impossibly Fast C++ Delegates을 좋아합니다. 아주 청초하고 사용하기 편한 구현은 Boost::function보다 빠르다고 주장했다.

여기에도 구현 된 이벤트를 찾을 수 있습니다. 나는 그들을 사용하지 않는다. .NET 스타일 (보낸 사람, args)을 사용하여 내 자신의 이벤트 처리를 구현했습니다.

+0

[Lightweight Generic C++ Callbacks (또는 또 다른 대표 구현)] (http://www.codeproject.com/Articles/136799/Lightweight-Generic-C-Callbacks-or-Yet-Another-Del)도 살펴볼 가치가 있습니다.). –

관련 문제