Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Funkcje lokalne, oddzielenie interfejsu listy od implementacji

Ostatnio zmodyfikowano 2016-11-17 19:09
Autor Wiadomość
mati220
Temat założony przez niniejszego użytkownika
Funkcje lokalne, oddzielenie interfejsu listy od implementacji
» 2016-11-12 21:23:12
Witam. Chciałem ostatnio podzielić program na pliki dla lepszej organizacji kodu. Dodałem plik nagłówkowy z deklaracjami funkcji a drugi z implementacją tych funkcji. W zasadzie są to funkcje do obsługi listy. Chciałem odizolować funkcje pomocnicze do obsługi listy od tych "głównych", które mają być dostępne dla korzystającego z tej listy. Po prostu żeby korzystający z tej listy nie miał możliwości wglądu do tzw. bebech tej listy jedynie takie jak dodaj, usuń itp. Próbowałem w pliku *.cpp przed funkcją dodać słowo kluczowe static ale nic to nie daje. W jaki sposób osiągnąć takie oddzielenie "interfejsu" listy od implementacji tych funkcji pomocniczych? Z góry dzięki za pomoc :)
P-153614
marcolo2307
» 2016-11-12 21:29:09
lib.hpp
void funkcjaGlowna();

help.hpp
void pomocniczna();

lib.cpp
C/C++
#include "lib.hpp"
#include "help.hpp"
void funkcjaGlowna()
{
    pomocnicza();
}

Chyba zrozumiesz o co mi chodzi :P Po prostu pomocnicze deklarujesz w osobnym nagłówku, którego nie oddajesz użytkownikowi, więc nie będzie miał do nich dostępu. Ewentualnie schowaj je w jakąś przestrzeń nazw, np. priv::.
P-153615
mati220
Temat założony przez niniejszego użytkownika
» 2016-11-12 21:34:31
Ok :) już zabieram się do pisania nowego nagłówka :)
a co do słowa kluczowego static, w wielu źródłach napisane jest że za pomocą tego słowa można tę funkcję/zmienną "zostawić do wglądu" jedynie w tym pliku w którym została zadeklarowana. Czemu jednak można jej użyć w funkcji głównej programu pomimo zastosowania słowa static? :)
P-153616
marcolo2307
» 2016-11-12 22:01:09
W tym już ci nie pomogę, nigdy z tego nie korzystałem :/
P-153617
mati220
Temat założony przez niniejszego użytkownika
» 2016-11-12 22:15:18
Napisałem tak jak poleciłeś a i tak dalej z funkcji głównej mam wgląd do tych pomocniczych. Może źle to napisałem, to może opiszę jak zrobiłem.
W pliku lista.h mam deklaracje funkcji głównych
w pliku lista_funkcje_pomocnicze.h mam deklaracje funkcji pomocniczych
w pliku lista.cpp mam definicje wszystkich funkcji w programie tych pomocniczych jak i głównych do obsługi listy.
W pliku głównym programu włączam tylko lista.h gdzie znajduje się sam "interfejs" do obsługi listy a jednak dalej mogę dalej używać funkcji pomocniczych które nie są włączone do tego pliku.

Gdzie w takim razie problem?
P-153618
marcolo2307
» 2016-11-12 22:41:31
Nie includujesz pomocniczych w nagłówku interfejsu?
P-153619
carlosmay
» 2016-11-12 23:07:32
Pokaż co masz, lub coś na obraz tego co robisz. Z fusów nikt ci nie powróży.
P-153621
mati220
Temat założony przez niniejszego użytkownika
» 2016-11-13 10:15:29
Ok. Pokażę chociaż zarys tego co mam. Jest to konsolowa wersja bazy kontaktów zrobiona na liście. Ogólnie program był napisany w C ale zmuszony zostałem do przepisania go na C++ ale nie chciałem się bawić w pisanie na obiektach, musiałbym to praktycznie od nowa projektować czego mi się robić nie chce. Dlatego część funkcji jest z C a niektóre do zarządzania pamięcią z C++. Ale do rzeczy.
 
Zawartość lista.h, teoretycznie tylko te funkcje miały być udostępnione dla użytkownika.
C/C++
#ifndef lista_h
#define lista_h
#define N 50

struct osoba {
    int id, * nr_tel, ilosc_nr_telefonu, ilosc_adresow_email;
    char imie[ N ], nazwisko[ N ], miasto[ N ], ulica[ N ], nr_domu[ N ], kod_pocztowy[ N ], poczta[ N ];
    struct mail {
        char email[ N ];
    } * adres_email;
   
    struct osoba * next;
   
};

void napisy( int napis );

int zapisywanie_do_pliku( struct osoba * lista );

int wczytywanie_z_pliku( struct osoba ** lista );

struct osoba * dodawanie_danych( struct osoba ** lista );

void wyswietlanie_z_sortowaniem( struct osoba * list_pointer );

struct osoba * usuwanie( struct osoba * list_pointer );

struct osoba * edycja( struct osoba * list_pointer );

void wyswietlanie_wyszukanych( struct osoba * lista );

#endif

Zawartość lista_funkcje_pomocnicze.h. Te funkcje dokonują różnych operacji których użytkownik ma nie widzieć.
C/C++
#ifndef lista_funkcje_pomocnicze_h
#define lista_funkcje_pomocnicze_h

int szukaj_wolnego_id( struct osoba * lista );

int szukaj_ostatniego_id( struct osoba * lista );

struct osoba * szukaj_ostatniego_elementu( struct osoba * lista );

struct osoba * szukaj_wybranego( struct osoba * lista, int nr );

struct osoba * sprawdz_czy_istnieje_id( struct osoba * lista, int nr );

struct osoba * szukaj_miejsca( struct osoba * lista, int id );

void usuwanie_znaku_nowego_wiersza( char * ciag );

struct osoba * dodawanie_do_posortowanej( struct osoba * lista, struct osoba * mini );

void wyswietlanie( struct osoba * lista, int wyswitlanie_usuwanie );

struct osoba * usuwanie_w_sortowaniu( struct osoba * lista, int wybor );

void usuwanie_listy( struct osoba ** lista );

struct osoba * kopiowanie_danych( struct osoba * lista, struct osoba * oryginal );

struct osoba * kopiowanie_listy( struct osoba * nowa_lista, struct osoba * oryginal );

void sortowanie( struct osoba * lista, int sortowanie_po_polu, int sposob );

void wyszukiwanie( struct osoba * lista, int wyszukiwanie_po_polu, char * szukane, int szukane_int );

#endif

Zawartość lista.cpp. Tutaj są definicje wszystkich funkcji, tych pomocniczych jak i tych, które powinien dostać użytkownik. Raczej nie wkleję całego kodu bo zajmuje on niespełna 1400 linijek a i tak nie potrzebne są raczej ich implementacje do wglądu.
C/C++
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <conio.h>
#define N 50
#include "lista.h"
#include "lista_funkcje_pomocnicze.h"

int szukaj_wolnego_id( struct osoba * lista ) {
    //...
}

int szukaj_ostatniego_id( struct osoba * lista ) {
    //...
}

struct osoba * szukaj_ostatniego_elementu( struct osoba * lista ) {
    //...
}

struct osoba * szukaj_wybranego( struct osoba * lista, int nr ) {
    //...
}

struct osoba * sprawdz_czy_istnieje_id( struct osoba * lista, int nr ) {
    //...
}

struct osoba * szukaj_miejsca( struct osoba * lista, int id ) {
    //...
}

void napisy( int napis ) {
    //...
}

void usuwanie_znaku_nowego_wiersza( char * ciag ) {
    //...
}

struct osoba * dodawanie_do_posortowanej( struct osoba * lista, struct osoba * mini ) {
    //...
}

int zapisywanie_do_pliku( struct osoba * lista ) {
    //...
}

int wczytywanie_z_pliku( struct osoba ** lista ) {
    //...
}

struct osoba * dodawanie_danych( struct osoba ** lista ) {
    //...
}

void wyswietlanie( struct osoba * lista, int wyswitlanie_usuwanie ) {
    //...
}

struct osoba * usuwanie_w_sortowaniu( struct osoba * lista, int wybor ) {
    //...
}

void usuwanie_listy( struct osoba ** lista ) {
    //...
}

struct osoba * kopiowanie_danych( struct osoba * lista, struct osoba * oryginal ) {
    //...
}

struct osoba * kopiowanie_listy( struct osoba * nowa_lista, struct osoba * oryginal ) {
    //...
}

void sortowanie( struct osoba * lista, int sortowanie_po_polu, int sposob ) {
    //...
}

void wyswietlanie_z_sortowaniem( struct osoba * list_pointer ) {
    //...
}

struct osoba * usuwanie( struct osoba * list_pointer ) {
    //...
}

struct osoba * edycja( struct osoba * list_pointer ) {
    //...
};

void wyszukiwanie( struct osoba * lista, int wyszukiwanie_po_polu, char * szukane, int szukane_int ) {
    //...
}

void wyswietlanie_wyszukanych( struct osoba * lista ) {
    //...
}

Zawartość pliku głównego programu. Ogólnie sam program może nie jest napisany bardzo profesjonalnie bo nie miałem okazji zobaczyć jak takie się pisze, jest to tylko projekt z 2 semestru, który teraz przerabiam. Także jak coś razi po oczach to sory ale to pierwszy grubszy projekt napisany "własnoręcznie" :D. Dodatkowo teraz widzę też co można byłoby poprawić w stosunku do tego co robiłem itp ale nie o to teraz chodzi :)
C/C++
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include "lista.h"

int main()
{
    int wybor;
    osoba * list_pointer = NULL;
    wczytywanie_z_pliku( & list_pointer );
    do {
        napisy( 0 );
        wybor = 0;
        fflush( stdin );
        scanf( "%d", & wybor );
        switch( wybor ) {
        case 1: list_pointer = dodawanie_danych( & list_pointer );
            zapisywanie_do_pliku( list_pointer );
            break;
        case 2: system( "CLS" );
            list_pointer = usuwanie( list_pointer );
            zapisywanie_do_pliku( list_pointer );
            break;
        case 3: system( "CLS" );
            wyswietlanie_z_sortowaniem( list_pointer );
            break;
        case 4: list_pointer = edycja( list_pointer );
            zapisywanie_do_pliku( list_pointer );
            break;
        case 5: wyswietlanie_wyszukanych( list_pointer );
            break;
        case 6: system( "CLS" );
            napisy( 7 );
            puts( "|              Nacisnij dowolny klawisz by przejsc do Menu                 |" );
            puts( "----------------------------------------------------------------------------\n" );
            getch();
            break;
        case 7: break;
        default: system( "CLS" );
            puts( "----------------------------------------------------------------------------" );
            puts( "|                            Nie ma takiej opcji                           |" );
            puts( "|                Nacisnij dowolny klawisz by powrocic do Menu              |" );
            puts( "----------------------------------------------------------------------------\n" );
            getch();
            break;
        }
        system( "CLS" );
    } while( wybor != 7 );
   
    return 0;
    system( "pause" );
}
P-153625
« 1 » 2 3
  Strona 1 z 3 Następna strona