Przekazywanie danych zapisanych do kontenerów miedzy różnymi jednostakami cpp

0

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ę :

  1. 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
  1. 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 ?

  2. 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;
}
0
  1. Używaj wersji przedrostkowej inkrementatorów (++i) zamiast przyrostkowej (i++) wszędzie gdzie się da.
  2. Nie kombinuj ze wskaźnikami tam gdzie to nie jest potrzebne:
typedef  struct
  {
    std::map<int,DaneA>       MapLista_A;
    std::map<int,DaneB>       MapLista_B;
  } PARAMS, *pPARAMS;

for(int nr=0;nr<1000;++nr)
  {
   paramsK.MapLista_A[nr]=DaneA(nr,nazwa_);
  }
 
for(int id=0;id<1000;++id)
  {
   wartosc=2.30*id;
   paramsK.MapLista_B[id]=DaneB(wartosc,miejsce_ );
  }
  1. Nie rozumiem czemu nie std::vector< przecież i tak numerujesz po kolei:
typedef  struct
  {
    std::vector<DaneA>       Vector_A;
    std::vector<DaneB>       Vector_B;
  } PARAMS, *pPARAMS;

paramsK.Vector_A.resize(1000);
for(int nr=0;nr<1000;++nr)
  {
   paramsK.Vector_A[nr]=DaneA(nr,nazwa_);
  }
paramsK.Vector_B.resize(1000);
for(int id=0;id<1000;++id)
  {
   wartosc=2.30*id;
   paramsK.Vector_B[id]=DaneB(wartosc,miejsce_);
  }
0
_13th_Dragon napisał(a):
  1. Nie kombinuj ze wskaźnikami tam gdzie to nie jest potrzebne:
  2. Nie rozumiem czemu nie std::vector<> przecież i tak numerujesz po kolei:

Dzięki.
Add.1 Jeśli w przyszłości będę zaciągał bardzo duże ilości danych to wolałbym korzystać ze sterty, dlatego pomyślałem o wskaźniku.
Add.2. MAP musi być , bo to tylko był uproszczony przykład, na pewno będą klucze typ std::string itd..

Czy jeśli bym pozostał przy wskaźnikach, takie podejście( funkcja czyszcząca) jest OK ?

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