Polaczenie dwoch funkcji w jedna.

0

Witam.
Pisze program obsługujący dwie listy jednokierunkowe i zarówno do jednej i drugiej listy potrzebuje takiej samej funkcji:
int GetLastDepId(Department *dephead) { /docelowo uruchamiana po wczytaniu wszystkich zeby zapamietac ost id/

    Department *tmp_dephead = dephead;
    int id = 0;

    if (tmp_dephead == NULL)
        return ++id;

    while (tmp_dephead != NULL)
        tmp_dephead = tmp_dephead->dep_next;
    id = dephead->dep_id;
    return ++id;
}
    Product *tmp_pdthead = pdthead;
    int id = 0;

    if (tmp_pdthead == NULL)
        return ++id;

    while (tmp_pdthead != NULL)
        tmp_dephead = tmp_pdthead->pdt_next;
    id = pdthead->pdt_id;
    return ++id;
}

Jak widać funkcje różnią sie tylko typem na który wskazuje wskaźnik, czy istnieje możliwość połączenia ich i korzystania z jednej dla dwóch rożnych typów?

0

oczywiście że istnieje, wystarczy użyć szablonów.

 
template<class T>
int GetLastDepId(T *dephead)
{
    T *tmp_dephead = dephead;
    int id = 0;
 
    if (tmp_dephead == NULL)
        return ++id;
 
    while (tmp_dephead != NULL)
        tmp_dephead = tmp_dephead->dep_next;
    id = dephead->dep_id;
    return ++id;
}
0

Możesz zrobić tę funkcję jako funkcję szablonową. Ogólnie to jak robisz kontener, to on powinien być cały szablonem, szczególnie jak używasz w nim więcej niż jednego typu danych. Dodatkowo C++ ma podstawowe kontenery, jak nie musisz sam implementować listy to użyj tych dostępnych, np. std::list (choć możliwe, że std::vector lub std::deque będą lepsze w twoim zastosowaniu, lista jest bardzo rzadko optymalnym wyborem).

0

Zapomniałem że to dział dla C++ i C, ja potrzebuje czystego C, a nie wydaje mi sie zeby w C szablony byly dostepne.. Zgadza sie?

0

No to zostają ci makra.

0

Jeśli elementami listy są wskaźniki to możesz użyć void* i rzutować (niezbyt ładne ani bezpieczne - dlatego właśnie powstały szablony)

0

No wlasnie nad tym myslałem, ale nie wiedziałem jak miałby wygladać nagłowek takiej funkcji i jak ją pozniej rzutowac na odpowiedni typ.. W nagłówku przydałoby sie chyba umiescic zmienna sterującą od której zależne bedzie to czy rzutujemy a Department* czy Product*..

GetLastId(void* head, int headtype){

 /*No i wlasnie jak zacząć... */

}
0
lukas90_ napisał(a):

No wlasnie nad tym myslałem, ale nie wiedziałem jak miałby wygladać nagłowek takiej funkcji i jak ją pozniej rzutowac na odpowiedni typ.. W nagłówku przydałoby sie chyba umiescic zmienna sterującą od której zależne bedzie to czy rzutujemy a Department* czy Product*..

GetLastId(void* head, int headtype){

 /*No i wlasnie jak zacząć... */

}

Ktoś mi kiedyś polecał GObject - OOP w C:
http://developer.gnome.org/gobject/stable/howto-gobject.html

Możesz tego użyć albo się na tym wzorować.

Do pobrania tutaj (GTK+):
http://www.gtk.org/

W innym przypadku to tylko akceptowalne są makra albo jakaś dłubanina...

1 użytkowników online, w tym zalogowanych: 0, gości: 1