Polaczenie dwoch funkcji w jedna.

Polaczenie dwoch funkcji w jedna.
  • Rejestracja: dni
  • Ostatnio: dni
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/

Kopiuj
    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;
}
Kopiuj
    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?

AL
  • Rejestracja: dni
  • Ostatnio: dni
0

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

Kopiuj
 
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;
}
ZJ
  • Rejestracja: dni
  • Ostatnio: dni
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).

  • Rejestracja: dni
  • Ostatnio: dni
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?

RE
  • Rejestracja: dni
  • Ostatnio: dni
0

No to zostają ci makra.

msm
  • Rejestracja: dni
  • Ostatnio: dni
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)

  • Rejestracja: dni
  • Ostatnio: dni
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*..

Kopiuj
GetLastId(void* head, int headtype){

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

}
vpiotr
  • Rejestracja: dni
  • Ostatnio: dni
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*..

Kopiuj
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...

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.