Struktura danych w projekcie

0

Hejka :) jestem dopiero początkującym programistą i chciałbym Was prosić o pomoc, radę w kwestii struktury danych mojego nowego projektu. Sytuacja wygląda następująco:

Program będzie wykonywał operacje na "blokach danych", jeden blok ma zawierać 3 tablice bajtowe (np. A, B, C) o rozmiarze 64.
Z tym, że tablice A i B będą wczytywane z pliku, a tablica C będzie powstawała w wyniku wykonania kilku operacji na tablicach A i B.
Myślałem, żeby stworzyć następującą strukturę:

#define SIZE 64;
typedef unsigned char byte;

struct Data
{
	byte *A, *B, *C;
	
	Data() {
		A = new byte[SIZE];
		B = new byte[SIZE];
		C = new byte[SIZE];
	}
	
	~Data() {
		delete [] A;
		delete [] B;
		delete [] C;
	}
	
	void makeC();	//metoda tworząca zawartość talicy C
};

W pliku może znajdować się różna ilość tych danych więc chciałem zrobić klasę, której obiekt będzie przechowywał zbiór tych bloków danych.
Będzie w niej znajdować się metoda odpowiedzialna za odczytywanie danych z pliku.

class DataCloud
{
public:
	DataCloud(): ptrData(NULL), size(0) {};
	
	DataCloud(int _size) {
		size = _size;
		ptrData = new Data[size]; 
	}
	
	DataCloud() {
		delete [] ptrData;
	}
	
	bool fromFile(const char *fname); //metoda wczytujaca dane z pliku
private:
	Data *ptrData;
	int size;
};

Chciałem się podpytać bardziej doświadczonych kolegów z forum, czy opisana przeze mnie struktura ma "rację bytu". Chętnie wysłucham ewentualnych wskazówek jak ją poprawić.
Chce bowiem uniknąć klepania bezmyślnego kodu w klawiaturę.

7
  1. Niepotrzebne alokacje.
  2. Łatwo o wycieki pamięci.
  3. Biblioteka standardowa nie jest od przeszkadzania, możesz się z nią "odobrazić" ;)
  4. Staraj się trzymać z daleka od "C z klasami".
  5. Makra to twój wróg. Btw, w twoim kodzie ewentualne SIZE + 1 nie przejdzie.

Całość sprowadza się do:

struct data_row{
	array<uint8_t, 64> a, b, c;
};
 
using data_table = vector<data_row>;
data_table load_data_table(const char *path);

http://ideone.com/2vzPPt

Ewentualnie z racji tego, że a, b, c nie mówią jakoś specjalnie wiele, można pokusić się o

using byte = uint8_t;
using data = array<byte, 64>;
using data_row = array<data, 3>;
using data_table = vector<data_row>;
0

@spartanPAGE Dobrze mówi, nie warto dynamicznie alokować jeśli nie ma absolutnie takiej potrzeby + zwykle najlepiej to użyć vectora.

0

Dzięki wielkie @spartanPAGE za podpowiedzi. Rzeczywiście nie ma co się męczyć z alokacjami, kiedy mogę skorzystać z biblioteki standardowej.

Mam jeszcze jeden dylemat, mianowicie: nie wiem czy zadeklarować vector<data_row> table w funkcji main() i wtedy pisać funkcje odpowiedzialne za wczytywanie z pliku load_from_file() i inne operacje operation1(), operation2()...

Czy może wykonać taką klasę:

class Data
{
public:
	Data();
	~Data();

	load_form_file();
	operation1();
	operation2();
	...
private:
	std::vector<data_row> table;
};

I wtedy utworzyć obiekt tej klasy w main() i w taki sposób to zorganizować :)
Jak myślicie?

2

Projekt klasy jest prawie dobry, ale:

  1. nie ma tu sensu dawać konstruktora
  2. nie ma tu sensu dawać desstruktora
  3. Każda z metod musi coś zwrócić lub przynajmniej void
0

@_13th_Dragon masz rację, konstruktor i destruktor tutaj w ogóle nie jest potrzebny.

Tak wiem, że te metody muszą coś zwracać (przynajmniej void), ale jeszcze ich nie zaplanowałem więc napisałem poglądowo operation1(), operation2().
Jeszcze raz dzięki za pomoc :) zabieram się za kodowanie :)

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.