2013-03-25 44 views
6

Tôi đoán sử dụng một con trỏ hàm bên trong một cấu trúc có cái gì đó để làm với việc đóng gói một hàm trong một cấu trúc ...? Nếu vậy, thì làm thế nào chính xác là điều này đạt được?Điều gì tốt là một con trỏ hàm bên trong một struct trong c?

Và những gì nó mang lại để có một con trỏ hàm bên trong một cấu trúc hơn là chỉ đơn giản là xác định hàm?

+1

Lợi thế là mỗi biến của loại cấu trúc có thể có chức năng riêng của nó. Bằng cách đó, bạn có thể có một cơ chế giống đa hình. – Fabien

+0

Đây là một cái gì đó giống như constructors/destructor từ C++. Cũng bằng cách này bạn có thể làm cho thừa kế. –

+2

Đó là tất cả nói chuyện rỗng mà không có bê tông, ví dụ thực tế của mã. Hiển thị một số mã bạn muốn hiểu. –

Trả lời

3

chức năng con trỏ bên trong cấu trúc là cơ sở của đối tượng lập trình trong C (xem http://www.planetpdf.com/codecuts/pdfs/ooc.pdf). Nó thực sự là thực sự cho các dự án C trung bình đến lớn.

Một ví dụ:

Tiêu đề:

typedef struct TPile 
{ 
    int(*Push)(struct TPile*, int); 
    int(*Pop)(struct TPile*); 
    void(*Clear)(struct TPile*); 
    void(*Free)(struct TPile*); 
    int(*Length)(struct TPile*); 
    void(*View)(struct TPile*); 

    int Nombre; 

    struct Titem *Top; 

} TPile ; 

Nguồn:

TPile TPile_Create() 
{ 
    TPile This; 
    TPile_Init(&This); 
    This.Free = TPile_Free; 

    return This; 
} 


TPile* New_TPile() 
{ 
    TPile *This = malloc(sizeof(TPile)); 
    if(!This) return NULL; 
    TPile_Init(This); 
    This->Free = TPile_New_Free; 

    return This; 
} 


void TPile_Clear(TPile *This) 
{ 
    Titem *tmp; 

    while(This->Top) 

    { 
     tmp = This->Top->prec; 
     free(This->Top); 
     This->Top = tmp; 
    } 

    This->Nombre = 0; 
} 
0

lợi ích của việc có con trỏ hàm được xác định trong cấu trúc, có liên quan đến thiết kế mã. mục tiêu là để mã của bạn được cấu trúc hơn.

Xác định các biến và chức năng trong một cấu trúc giống như định nghĩa lớp bằng các ngôn ngữ hướng đối tượng

Tham khảo link sau để biết thêm chi tiết

+0

Xác định một đối tượng trong ngữ cảnh OOP cũng bị đóng gói quá ... là đạt được ở đây? –

+0

nó chỉ là một phương pháp làm việc trong c nó giống như OOP nhưng nó không phải là một OOP thực sự. để làm việc với OOP, bạn phải sử dụng C++ thay vì – MOHAMED

+0

@NithishInpursuitOfhappiness tham chiếu đến liên kết này để biết thêm chi tiết http://stackoverflow.com/questions/351733/can-you-write-object-oriented-code-in-c – MOHAMED

1

Một ssume hàm nhận 2 biến và gọi 4 hàm khác nhau. Để có cấu trúc như sau:

/* Input 1    Input 2     Function pointer 
{ 
{ 0,      0,     Function00}, 
{ 0,      1,     Function01}, 
{ 1,      0,     Function10}, 
{ 1,      1,     Function11} 
} 

Sẽ dễ dàng so sánh giá trị đầu vào với giá trị cấu trúc và gọi hàm tương ứng.

Nó có vẻ nó là tốt hơn để sử dụng if..else ... Nhưng nghĩ đến trường hợp trong đó có hơn 100 trường hợp này phải được kiểm tra

2

Có chức năng con trỏ bên trong struct sẽ hữu ích cho dữ liệu nhất định các cấu trúc như cây tìm kiếm nhị phân.

phép nói rằng, tôi muốn chèn một phần tử có cấu trúc là

struct Employee { 
     int eid; 
     char *name; 
}; 

thành một cây tìm kiếm nhị phân. nhưng tôi muốn BST sử dụng chức năng của tôi để so sánh các phần tử trong khi lưu trữ và tìm kiếm.

và cấu trúc bst sẽ như sau.

struct BST { 
    struct _node *root; 
    int (*compare)(void *e1 , void *e2); 
}; 

Bây giờ, tôi sẽ sử dụng BST như sau.

int main(void){ 
     struct Emp e1 = { 1, "John" }; 
     struct BST *t = create_tree(); 
     t->set_compare(&compare); 

     t->insert(e1); 


     t->get(e1); 
     ... 
    } 

    int compare(void *e1 , void *e2) 
    { 
     //type cast e1, e2 as struct Emp 
     // return the comparison result based on id 
    } 

Lợi thế tôi thấy là tôi không cần phải chuyển con trỏ hàm này vào tất cả các chức năng hoạt động BST của tôi.

nhưng lưu trữ tất cả các chức năng công khai bên trong cấu trúc sẽ mang phong cách OOP bên trong mã C, giống như những gì người khác nói.

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