2010-06-13 22 views
7

Giả sử tôi có các lớp ViewA và ViewBTrong c + + có bất kỳ Sự kiện/đại biểu/giao diện/thông báo nào! có gì không?

Trong C mục tiêu bằng cách sử dụng mô hình đại biểu tôi có thể làm

@protocol ViewBDelegate{ 

- (void) doSomething(); 
} 

sau đó trong giao diện ViewB:

id<ViewBDelegate> delegate; 

sau đó trong việc thực hiện ViewA tôi đặt người được ủy quyền:

viewB.delegate = self; 

và bây giờ tôi có thể gọi trong doSomething từ viewB lên bất kỳ đại diện kiểu không xác định nào.

[delegate doSomething]; 

"C++ Cách lập trình" đã trở nên tồi tệ hơn khi đọc không thể tìm thấy các ví dụ đơn giản thể hiện các mẫu thiết kế cơ bản.

gì tôi đang tìm kiếm trong C++ như sau:

  • sự kiện ActionScript và java
  • hoặc đại biểu hoặc NSNotifications trong Objective C

bất cứ điều gì cho phép loại A, loại B và Class C để biết rằng ClassX didSomething() !!!

cảm ơn

Trả lời

9

Nếu tôi là bạn, tôi sẽ không sử dụng các con trỏ hàm để hoàn thành nhiệm vụ này. Để tùy chọn này cho các bậc thầy;)

Trong Tăng cường, có một thư viện đẹp được gọi là signals. Nó làm cho cuộc sống của bạn dễ dàng hơn! Đây là một ví dụ về việc sử dụng:

#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(); 
} 

này sẽ in:

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

Sau đây là cách nó hoạt động.

Đầu tiên, bạn khai báo nơi chứa các đại biểu:

signal<void()> list_of_actions; 

Sau đó, bạn "kết nối" nó với những gì từng nhóm chức năng/functors/callable điều bạn muốn gọi.

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)); 

Lưu ý rằng tôi đã sử dụng bind. Vì vậy, rằng các loại hàm trong list_of_actions là như nhau, nhưng chúng ta có thể kết nối nó với các kiểu lớp khác nhau. Vì vậy:

bind(&A::A_action, a) 

điều này, tạo ra một điều callable, kiểu void() như chúng ta tuyên bố là loại list_of actions trước đó. Tất nhiên, bạn chỉ định cá thể bạn muốn áp dụng chức năng thành viên này trong tham số thứ hai ..

Nếu bạn đang làm công cụ đa luồng, hãy sử dụng chị em signals2.

Hy vọng điều đó sẽ hữu ích.

+0

cảm ơn Arak vì đã dành thời gian và thêm ví dụ. kết thúc tìm kiếm của tôi. Rực rỡ! – Bach

+0

câu trả lời tuyệt vời. – Ross

2

Không có đại biểu/sự kiện/v.v.

Bạn có thể mô phỏng giao diện bằng chức năng ảo thuần túy, xem here cho một câu hỏi tương tự.

Và có những function pointers ...

Vì vậy, về cơ bản là câu trả lời cho bạn câu hỏi được không, có ai trong số đó trong C++ (không biết về các tiêu chuẩn mới nhất), nhưng có những sản phẩm thay thế và cách giải quyết ..

+0

cảm ơn tôi sẽ kiểm tra việc triển khai giao diện nên thực hiện. – Bach

1

Không có ngôn ngữ C++, cũng như Thư viện chuẩn được liên kết, có đại biểu hoặc sự kiện. Tất nhiên có rất nhiều thư viện triển khai những thứ như vậy, hoặc bạn có thể tự mình thực hiện chúng.

+0

cảm ơn Neil. Tôi thực sự cảm thấy khó học ngôn ngữ, tôi nhận ra sự hư hỏng có thể là Mục tiêu C và python! – Bach

+2

@Bach Khi học bất kỳ ngôn ngữ nào, điều quan trọng là bạn không nên cố gắng chuyển sang memes từ các ngôn ngữ khác mà bạn biết. C++ thực sự không có gì giống như Python - Tôi không thể nói về Objective C. Và lưu ý rằng bạn CÓ THỂ làm việc ủy ​​nhiệm trong C++ - nó không chỉ là một phần của ngôn ngữ. –

+0

Tôi đồng ý Neil mặc dù tôi không thể giúp, vì tôi biết chính xác những gì tôi muốn làm, và tôi xem nó được thực hiện bằng các ngôn ngữ khác như thế nào, vì vậy tôi tự nhiên cố gắng tìm ra tương đương trong C++. Tất cả các phần của việc khám phá và học hỏi tôi cho là vậy. Sẽ kiểm tra tất cả các đề xuất ở đây. Stackoverflow đã đánh bại bất kỳ cuốn sách nào tôi đã đọc về bất kỳ ngôn ngữ, thông tin và đầy đủ các chuyên gia. cảm ơn mọi người. – Bach

1

Tất cả tôi biết có một loại phương pháp gọi là gọi lại phương pháp (Trong thực tế, chức năng con trỏ).

Ủy quyền? Nó chỉ là một loại phương pháp gọi lại bọc, và, trông tiên tiến

+0

cảm ơn rhapsodyn. Tôi đoán tôi đã nâng cao cho các cấp. không có gì thanh lịch về C++ đến từ mục tiêu C. dù sao cũng nhờ sự giúp đỡ. – Bach

5

bất cứ điều gì cho phép loại A, loại B và Class C để biết rằng ClassX didSomething() !!!

Có lẽ bạn đang tìm kiếm signals & slots, trong đó có nhiều hiện thực:

tôi chắc chắn có nhiều, nhưng đây là những quan trọng nhất của mà tôi biết.

1

"C++ Làm thế nào để chương trình" đã trở thành tồi tệ hơn đọc một không thể tìm thấy ví dụ đơn giản mà thể hiện các mẫu thiết kế cơ bản

Tôi nghĩ rằng the original Design Patterns book bao gồm ví dụ về làm thế nào để thực hiện từng mô hình sử dụng C++.

2

Cá nhân tôi thích The Impossibly Fast C++ Delegates bởi Sergey Ryazanov. Triển khai rất gọn gàng và dễ sử dụng, tuyên bố nhanh hơn Boost::function.

Bạn cũng có thể tìm thấy các sự kiện được triển khai ở đó. Tôi không sử dụng chúng, tuy nhiên. Tôi đã thực hiện xử lý sự kiện của riêng mình bằng cách sử dụng kiểu .NET (sender, args).

+0

Cũng đáng xem xét là [Lightweight Generic C++ Callbacks (hoặc, Tuy nhiên, thực hiện đại biểu khác)] (http://www.codeproject.com/Articles/136799/Lightweight-Generic-C-Callbacks-or-Yet-Another-Del). –

Các vấn đề liên quan