2013-03-25 16 views
6

Zgaduję, że za pomocą wskaźnika funkcji wewnątrz struktury ma coś wspólnego z enkapsulacji funkcji w strukturze ...? Jeśli tak, to jak dokładnie to osiągnięto?Co to jest wskaźnik funkcji wewnątrz struktury w c?

Co to za korzyść, że wskaźnik funkcji wewnątrz struktury, a nie po prostu określa funkcję?

+1

Zaletą jest to, że każda zmienna typu struct może mieć swoją własną funkcję. W ten sposób możesz mieć mechanizm podobny do polimorfizmu. – Fabien

+0

To jest coś w rodzaju konstruktorów/destruktorów z C++. Również w ten sposób możesz dokonać dziedziczenia. –

+2

To wszystko pusta rozmowa bez konkretnych, praktycznych przykładów kodu. Pokaż kod, który chcesz zrozumieć. –

Odpowiedz

3

funkcyjne wskaźniki wewnątrz struktury bazy obiektowego programowania w C (patrz http://www.planetpdf.com/codecuts/pdfs/ooc.pdf). To naprawdę tak naprawdę dla średnich i dużych projektów C.

Przykład:

Header:

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 ; 

Źródło:

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

zaleta posiadania wskaźnika funkcji zdefiniowanego w strukturze, jest związana z projektem kodu. celem jest zwiększenie struktury kodu.

Definiowanie zmiennych i funkcji w strukturze jest jak zdefiniowanie klasy w zorientowanych języków obiektowych

Poniższa link więcej szczegółów

+0

Definiowanie obiektu w kontekście OOP powoduje, że enkapsulacja zbyt ... jest tutaj osiągnięta? –

+0

to po prostu metoda pracy w c to jak OOP, ale to nie jest prawdziwy OOP. do pracy z OOP musisz użyć C++ zamiast – MOHAMED

+0

@NishishInpursuitOfhappiness odnieść się do tego linku po więcej szczegółów http://stackoverflow.com/questions/351733/can-you-write-object-oriented-code-in-c – MOHAMED

1

ssume funkcja przyjmuje 2 zmienne i wywołuje 4 różne funkcje. Niech będzie struktura w następujący sposób:

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

Łatwo będzie porównać wartości wejściowe z wartościami struktury i wywołać odpowiednią funkcję.

Mogłoby się wydawać, że lepiej jest użyć if..else ... Ale myślę o przypadkach, w których jest więcej niż 100 takich przypadków być sprawdzane

2

Mając funkcja wskaźnik wewnątrz struktury będą użyteczne dla pewnych danych struktury takie jak drzewo wyszukiwania binarnego.

Powiedzmy, chcę wstawić element, którego struktura jest

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

do wyszukiwania binarnego drzewa. ale chciałbym, aby BST użył mojej funkcji do porównywania elementów podczas przechowywania i wyszukiwania.

a struktura bst będzie następująca.

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

Teraz będę korzystać z BST w następujący sposób.

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 
    } 

Zaletą widzę jest i nie trzeba trzymać na podaniu tej opcji wskaźnik do moich wszystkich funkcji operacyjnych BST.

ale przechowywanie wszystkich publicznych funkcji wewnątrz struct przyniesie styl OOP wewnątrz kodu C, jak to, co mówią inni.