Jak najlepiej klasie bazowej podać dane

0

Aplikacja, którą piszę wczytuje z pliku z danymi (PD) wiersze o zdefiniowanej strukturze. Są 2 typy wierszy danych, którym stworzyłem klasy. Obie klasy dziedziczą z bazowej, która ma metody wykorzystywane przez obie potomne. Bazowa ma metodę detekcji, która powinna być zasilona pewnymi danymi słownikowymi z 4 plików (PS). Nie chcę by pliki PS były odczytywane dla każdego wiersza z pliku PD - czyli w klasie bazowej. Chcę by PS były odczytane tylko raz.
Jak to najlepiej osiągnąć?

0

Jeżeli są to pliki o niewielkiej wielkości to możesz załadować je do kontenera vector<char> w następujący sposób.

using namespace std;

ifstream file( "file_to_read",  ios::binary | ios::ate );
auto size = file.tellg();
file.seekg( 0 ,  std::ios::beg );

vector<char> buffer( size );
auto status = file.read( buffer.data() ,  size );
0

Odczyt pliku do wektora nie jest problemem.
Pytanie raczej o najlepszą metodę podania wektorów do klasy bazowej. Może użycie składowych statycznych czy jakiegoś triku do jednorazowego wykonania odczytu plików w klasie bazowej.

1

Szczerze powiem, że po opisie mało wiadomo.

  1. Wykorzystujesz polimorfizm?
  2. Co to znaczy 'metoda detekcji'? Klasa bazowa wykrywa jaki typ wiersza chcesz stworzyć?
  3. Jaki ma być czas życia PS względem czasu życia wierszy?

Najlepiej jak pokażesz MVCE z kodem, który wczytuje PS za każdym razem, w klasie bazowej. Wtedy od razu będzie widać co masz teraz i co można z tym zrobić.

P.S. Taki protip: IMHO wprowadzanie skrótów PD i PS tylko zaciemniło post. Po prostu pisz pełnymi nazwami. Nie jesteśmy parserami, żeby po skrótach natychmiast wiedzieć co on oznacza. Za każdym razem jak widziałem PS musiałem wracać do miejsca, gdzie to było zdefiniowane, żeby ogarnąć co to jest.

0

Witam,
Może takie rozwiązanie. Wczytasz dane raz w klasie PSData a potem wstrzykniesz wskaźnik na PSData do klasy bazowej:

#include <iostream>
#include <memory>
using namespace std;

class PSData
{
	char* mData;
public:
	void Load() {};
	char* GetData()
	{
		cout << "GetData: " << this << endl;
		return mData;
	}
};

class DataLine
{
public:
	DataLine(std::shared_ptr<PSData>& data)
	{
		data->GetData();
	}
};

class DataType1 : public DataLine
{
public:
	DataType1(std::shared_ptr<PSData>& data) : DataLine(data)
	{}
};

class DataType2 : public DataLine
{
public:
	DataType2(std::shared_ptr<PSData>& data) : DataLine(data)
	{}
};

int main() {
	shared_ptr<PSData> ptr = make_shared<PSData>();
	DataType2 d2 = DataType2(ptr);
	DataType1 d1 = DataType1(ptr);
	return 0;
}

ideone

1

Pytanie jest zbyt ogólnikowo zadane by dostarczyć dobrą odpowiedz.
Najlepiej podaj przykład danych, pokaż jakie masz klasy. Najlepiej jednak opisz rodzaj trzymanych danych, żeby nie skończyło się problemem XY.

0

Kolega Dawid123 załapał problem. W klasie bazowej nie chciałbym wczytywać plików słownikowych dla każdego wiersza z pliku analizowanych danych. Bo 4 pliki słownikowe musiałbym odczytywać dla każdego wiersza. Program ma zwykle kilkanaście do kilkudziesięciu tysięcy wierszy w pliku z badanymi danymi więc było by to zarzynaniem dysku.

0

@stryku

  1. Nie, aktualnie nie używam polimorfizmu.
  2. Metoda detekcji to metoda w plasie bazowej (wspólnej), która na podstawie słowników i danych z pliku analizowanych danych dokonuje pewnego rozpoznania danych.
  3. Wczytane słowniki PS mają być zachowane do analizy ostatniego wiersza danych. Później je usunę z pamięci.
0

Podtrzymuję, oraz podbijam odpowiedź MarkaR22. Podaj kod, który masz oraz przykład danych wejściowych.
Po tym co opisujesz, wydaje mi się, że przepychanie danych do klasy bazowej nie jest potrzebne, ale nie znam przypadku tak dobrze jak Ty, więc daj sobie pomóc i podaj przykłady (:

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