Jak najlepiej klasie bazowej podać dane

Odpowiedz Nowy wątek
2019-06-15 06:47
tk1
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ąć?


pozdrawiam
tk1

Pozostało 580 znaków

2019-06-15 10:32
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 );

Pozostało 580 znaków

2019-06-16 07:55
tk1
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.


pozdrawiam
tk1

Pozostało 580 znaków

2019-06-16 10:52
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.

edytowany 1x, ostatnio: stryku, 2019-06-16 10:54

Pozostało 580 znaków

2019-06-16 14:14
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

edytowany 1x, ostatnio: Dawid123, 2019-06-16 14:16

Pozostało 580 znaków

2019-06-17 15:08
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.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22, 2019-06-17 15:47

Pozostało 580 znaków

2019-06-18 19:38
tk1
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.


pozdrawiam
tk1
edytowany 1x, ostatnio: tk1, 2019-06-18 19:39

Pozostało 580 znaków

2019-06-18 20:54
tk1
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.

pozdrawiam
tk1
edytowany 1x, ostatnio: tk1, 2019-06-18 20:54

Pozostało 580 znaków

2019-06-18 22:50
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 (:

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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