Từ 1 tới 3 trên tổng số 3 kết quả

Đề tài: Hàm callback trong C++

  1. #1
    Ngày gia nhập
    03 2009
    Bài viết
    1

    Mặc định Hàm callback trong C++

    Lâu rồi mới quay lại diễn đàn định viết một bài về hàm callback trong C++ cho anh em cùng chém gió.
    Để hình dung về callback các bạn cùng xem ví dụ:

    Code:
    // pointer to functions
    #include <iostream>
    using namespace std;
    int addition (int a, int b)
    { return (a+b); }
    int subtraction (int a, int b)
    { return (a-b); }
    int operation (int x, int y, int (*functocall)(int,int))
    {
      int g;
      g = (*functocall)(x,y);
      return (g);
    }
    int main ()
    {
      int m,n;
      int (*minus)(int,int) = subtraction;
      m = operation (7, 5, addition);
      n = operation (20, m, minus);
      cout <<n;
      return 0;
    }
    Nhìn code thì ai cũng hiểu, nhưng chúng ta cùng phân tích nào.
    ta thấy rằng ở thân trương trình chính có gọi hàm operation và truyền vào tham số addition và minus. đó chính là tên của hàm ở trên.
    Điều này có nghĩa là gì? Điều này mở ra một khái niệm hook trong một tương trình C++. Giả sử chương trình chính của bạn bắt buộc muốn chạy một hàm nào đó, hoặc thư viện của bạn bắt buộc phải chạy hàm nào đó. bạn muốn một lập trình viên khác có cơ hội thay đổi hành vi của hàm mà bạn đã viết, đó chính là lúc dùng đền function pointer. Trong trường hợp này, giả sử bạn đã viết hàm opertion, và một lập trình viên khac có thể tùy biến hàm của bạn bằng cách viết hàm riêng cho họ chính là hàm addition và minus.
    Tuy nhiên trong trương trình chính bạn vẫn phải gọi đích danh hàm opertaion(7,5,minus). Điều này làm bạn mơ hồ về khả năng của FP.
    Nhưng bây giờ bạn thử nghĩ nếu như tham số truyền vào cho operation không phải là 1 con trỏ mà là một mảng các con trỏ, mảng này được load từ một hàm khác, hàm này sẽ lấy hết nhưng hàm được viết theo 1 qui định nào đó rồi truyền vào cho hàm operation của bạn. Điều đó sẽ như thế nào.

    Mình chỉ liên tưởng từ ví dụ này với khái niệm hook của một số hệ quản trị nội dung ( CMS ) đặc biệt là drupal.

    Dù sao tớ vấn rất mơ hồ viết bài này mong các bạn góp ý và cùng nêu ra những tình huống của con trỏ hàm !

  2. #2
    Ngày gia nhập
    07 2011
    Bài viết
    160

    Thực sự chưa hiểu rõ bạn muốn gì. Nếu chỉ là chém gió thì mình cũng chém cùng
    Function pointer là 1 khái niệm có từ C. Với C++ thì đương nhiên tương thích với C, nhưng C++ có những khái niệm linh hoạt hơn trong khi không kém mạnh mẽ, và hoàn toàn có thể thay thế function pointer, đó là virtual function và function object.
    Ví dụ viết lại ý tưởng hàm operation() của bạn theo hướng đối tượng sử dụng virtual function:
    C++ Code:
    1. class Base() {
    2. virtual int functocall(int, int) = 0;
    3. public:
    4. int operation(int x, int y) { return 1+functocall(x,y);} // Mình thêm 1+ vào chứ không thì operation chẳng khác gì functocall
    5. };
    6. class Derive_add:public Base {
    7. int functocall(int x, int y) {return x+y;}
    8. }
    9. class Derive_minus:public Base {
    10. int functocall(int x, int y) {return x-y;}
    11. }

    Hoặc viết lại dùng function object:
    C++ Code:
    1. template<class T>
    2. int operation(int x, int y, T t) {return 1+t(x,y);}
    sau đó bạn có thể gọi: operation(x, y, std::plus<int>());
    hay operation(x, y, std::minus<int>()); // std::plus<int> và std::minus<int> là 2 class có sẵn trong STL
    bạn cũng có thể gọi operation(x, y, addition) với hàm addition như bạn định nghĩa. Addition là hàm, trong khi std::plus<int>() là 1 đối tượng, nhưng đều xài được. Sử dụng function object có nhiều lợi thế so với function pointer đặc biệt là khi kết hợp với template

    Bộ thư viện boost (www.boost.org) có thư viện boost::function đóng gói lại khái niệm function / callback sử dụng rất tiện lợi. Kết hợp với boost::bind và/hoặc boost::lambda thì thật vô cùng sung sướng Sử dụng tối đa các thư viện có sẵn để đứng trên vai người khổng lồ và tránh "reinvent the wheel" luôn là ưu tiên hàng đầu của mình khi tổ chức thực hiện các project ^^

  3. #3
    Ngày gia nhập
    10 2009
    Bài viết
    12

    Trích dẫn Nguyên bản được gửi bởi fbchicken Xem bài viết
    Thực sự chưa hiểu rõ bạn muốn gì. Nếu chỉ là chém gió thì mình cũng chém cùng
    Function pointer là 1 khái niệm có từ C. Với C++ thì đương nhiên tương thích với C, nhưng C++ có những khái niệm linh hoạt hơn trong khi không kém mạnh mẽ, và hoàn toàn có thể thay thế function pointer, đó là virtual function và function object.
    Ví dụ viết lại ý tưởng hàm operation() của bạn theo hướng đối tượng sử dụng virtual function:
    C++ Code:
    1. class Base() {
    2. virtual int functocall(int, int) = 0;
    3. public:
    4. int operation(int x, int y) { return 1+functocall(x,y);} // Mình thêm 1+ vào chứ không thì operation chẳng khác gì functocall
    5. };
    6. class Derive_add:public Base {
    7. int functocall(int x, int y) {return x+y;}
    8. }
    9. class Derive_minus:public Base {
    10. int functocall(int x, int y) {return x-y;}
    11. }

    Hoặc viết lại dùng function object:
    C++ Code:
    1. template<class T>
    2. int operation(int x, int y, T t) {return 1+t(x,y);}
    sau đó bạn có thể gọi: operation(x, y, std::plus<int>());
    hay operation(x, y, std::minus<int>()); // std::plus<int> và std::minus<int> là 2 class có sẵn trong STL
    bạn cũng có thể gọi operation(x, y, addition) với hàm addition như bạn định nghĩa. Addition là hàm, trong khi std::plus<int>() là 1 đối tượng, nhưng đều xài được. Sử dụng function object có nhiều lợi thế so với function pointer đặc biệt là khi kết hợp với template

    Bộ thư viện boost (www.boost.org) có thư viện boost::function đóng gói lại khái niệm function / callback sử dụng rất tiện lợi. Kết hợp với boost::bind và/hoặc boost::lambda thì thật vô cùng sung sướng Sử dụng tối đa các thư viện có sẵn để đứng trên vai người khổng lồ và tránh "reinvent the wheel" luôn là ưu tiên hàng đầu của mình khi tổ chức thực hiện các project ^^
    mấy cái phần này ít học quá... nên chẳng hiểu gì...

Các đề tài tương tự

  1. Callback 1 hàm thuộc dll C++ trong C#
    Gửi bởi cuongbk14 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 27-09-2013, 04:42 PM
  2. Hàm Callback trong OpenGL
    Gửi bởi khue_tayson trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 2
    Bài viết cuối: 10-10-2010, 04:47 PM
  3. CALLBACK trong Visual C++ có ý nghĩa gì?
    Gửi bởi langman trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 17
    Bài viết cuối: 05-10-2010, 11:54 PM
  4. sử dụng hàm callback trong C++ như thế nào?
    Gửi bởi hoangtiencdt trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 5
    Bài viết cuối: 08-12-2009, 07:53 PM
  5. function callback trong C++. Xin giúp đỡ vấn đề về callback??
    Gửi bởi bboy0303 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 24-05-2009, 12:34 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn