Witam,
chciałbym napisać program, który będzie obrabiał dane zaciągane z pliku ( wyświetlał tabelki , wykresy ... itd.) .
Idea jest taka:
a. Deklaruję i definiuję obiekty własnego typu DANE w plikach DANE.H i DANE.CPP
b. Do pliku nagłówkowego MAIN.H . ładuję nagłówek DANE.H ( deklaracje tych moich typów)
c. W dedykowanej do tego funkcji tworzę wskaźniki do obiektów typu DANE, wypełniam je i wrzucam do kontenrów MAP
d. W różnych funkcjach obrabiam je.
f. Po zakończeniu sprzątam - usuwam wskaźniki do tych obiektów, czyszczę kontenery MAP.
I mam kilka wątpliwości.
Ponieważ dane załadowane do kontenerów będą wykorzystywane w różnych plikach CPP zastanawiam się :
- Jak rozwiązać problem przekazywania tych danych między różnymi funkcjami z różnych plików CPP?
Pomyślałem , że najlepszym rozwiązaniem będzie :
- utworzenie w MAIN.H obiektu globalnego , który będzie strukturą zawierająca różne kontenery typu MAP :
typedef struct
{
// Kontenery przyjmujące wsk do obiektów: ListaA, ListaB.
std::map<int, DaneA *> MapLista_B;
std::map<int, DaneB *> MapLista_B;
}
PARAMS, *pPARAMS ;
static PARAMS paramsK ;
- przekazywanie tego obiektu ( referencji) do różnych funkcji
-
Jednak musiałbym do każdego pliku CPP ładować nagłówek MAIN.H , który zawiera deklaracje typów własnych DANE . Czy to jest właściwe rozwiązanie ?
-
Czy sprzątanie jest poprawne ?
Poniżej przedstawiam bardzo uproszczony kod:
//DANE - jednostka kompilacji do przechowywania danych 2 typów ( 2 klasy)
//DANE.H
class DaneA
{
int nr;
string nazwa;
public :
DaneA ();
DaneA(int nr_, string nazwa_);
};
class DaneB
{
double wartosc;
string miejsce;
public :
DaneB ();
DaneB(double wartosc_, string miejsce_);
}
//DANE.CPP
//...
//MAIN.H
// Zawiera obiekt globalny PARAMS paramsK , który będzie przekazywany jako parametr do funkcji
typedef struct
{
// Kontenery przyjmujące wsk do obiektów: ListaA, ListaB.
std::map<int, DaneA *> MapLista_B;
std::map<int, DaneB *> MapLista_B;
}
PARAMS, *pPARAMS ;
static PARAMS paramsK ;
//MAIN.CPP
// Wywołuje funkcję kopiującą dane do kontenerów, wyświetlającą itd
#include "main.h"
extern WczytajDane(PARAMS & paramsK ); // ta funkcja jest w jakimś tam pliku CPP
extern ObliczPewneWartosci(PARAMS & paramsK ); // ta funkcja jest w jakimś tam pliku CPP
extern PokazWykres(PARAMS & paramsK ); // ta funkcja jest w jakimś tam pliku CPP
int Posprzataj();
void Thread (PVOID pvoid)
{
WczytajDane( paramsK );
ObliczPewneWartosci(paramsK);
PokazWykres(paramsK)
...
...
int Posprzataj();
}
int Posprzataj()
{
for( paramsK.MapLista_A_it = paramsK.MapLista_A.begin();
paramsK.MapLista_A_it != paramsK.MapLista_A.end() ; ++paramsK.MapLista_A_it )
{
delete (paramsK.MapLista_A_it->second);
}
paramsK.MapLista_B.clear();
for( paramsK.MapLista_B_it = paramsK.MapLista_B.begin();
paramsK.MapLista_B_it != paramsK.MapLista_B.end() ; ++paramsK.MapLista_B_it )
{
delete (paramsK.MapLista_B_it->second);
}
paramsK.MapLista_B.clear();
return 0;
}
// WCZYTAJ_DANE.CPP - wstawiam dane do 2 kontenerów
int WczytajDane (PARAMS & paramsK )
{
double wartosc;
string nazwa_;
string miejsce_;
...
...
// Wstawiam dane do kontenera A
for( int nr = 0 ; nr < 1000 ; nr++)
{
paramsK.MapLista_A.insert (std::pair< int, DaneA *> (nr, new DaneA(nr, nazwa_));
}
// Wstawiam dane do kontenera B
for( int id = 0 ; id < 1000 ; id++)
{
wartosc = 2.30*id;
paramsK.MapLista_B.insert (std::pair< int, DaneB *> (id, new DaneB(wartosc, miejsce_ ));
}
return 0;
}