Wczytywanie danych z pliku do tablicy wskaźników na klasę bazową [C++]

0

Witam, proszę o pomoc!
Bardzo chciałbym wiedzieć jak wczytać dane z pliku tekstowego do tablicy wskazników na klasę bazową. Trochę trudno mi wytłumaczyć o co Mi chodzi, więc napisałem przykładowy kod, który powinien rozjaśnić sprawę. Ale po krótce, mam taką tablicę wskazników na klasę bazową, a w pliku mam zapisane obiekty klas pochodnych oraz bazowych, pomieszane, np. w 1-szej linijce z klasy pochodnej, w 2-giej z bazowej, w 3-ciej jeszcze z innej klasy pochodnej, itd.
przykładowy KOD: http://pastebin.com/EALeGP7e

Pewnie to jakaś błacha sprawa dla fachowca, do rozwiązania w kilka sekund, ale ja tego nie mogę pojąć. Szukałem tego długo w internecie i nic nie znalazłem, bo wczytywać teksty i zmienne jak wiemy co dokładnie jest w której linijce to nie problem, ale tutaj to troszkę co innego ;)

0

Wowowo, czyli to trzeba tworzyć aż nową strukturę i obsługiwać wektorami? Bo w zasadzie ja mam już projekt zrobiony i nie chciałbym wszystkiego znowu zmieniać, bo mam juz nieweiele czasu, wszystkie funkcje działają oprócz właśnie tej {zapis jest robiony np. funkcjami wirtualnymi, ale jak próbowałem tego samego do wczytu to program się wywalał}. Ale tak czy siak, dziękuję za pomysł :) Nie da rady prościej jakoś?

1

Nikt nie powiedział że masz to obsługiwać wektorami, możesz użyć zwykłe tablice struktur.
Tu chodzi o zasadę: - w zależności od wczytanego unikalnego klucza tworzysz odpowiednią klasę która sama "doczytuje" niezbędną resztę.
Przy zapisie sam ten unikalny klucz zapisujesz.

0

Sorki, ale programuje od niedawna więc trochę topornie mi to wszystko wchodzi, mógłbyś troszkę szerzej wytłumaczyć z tym kluczem? Bo trochę nie rozumiem na czym miałby polegać algorytm.

1

Kluczem może być dowolny unikalny dla każdej z tych wczytywanych/zapisywanych klas ciąg znaków, np to co zwraca: typeid(obiekt).name();

0

Jakby rozumiem o co Ci chodzi, ale nie mam pojęcia jak to zaimplementować. No bo tak po kolei, mamy tą tablicę **tab=new bazowa *[rozmiar]; - w niej chcemy przechowywać wskaźniki na różne obiekty klas pochodnych. No i właśnie jak próbuję zrobić taki klucz [o ile dobrze rozumiem] dla każdej z klas pochodnych [czyli ja próbuję tak, że dla każdej pochodnej mam funkcję wirtualną która właśnie wczytuje {wczyt(fstream &plik)} , np. plik>>z1; plik >> z2; etc., dla każdej klasy trochę się różni ta funkcja, bo są inne zmienne]. I teraz tak: chcemy wczytać plik, zabrać z niego dane i zapisać do tablicy i zamknąć. To robię pętle for i w pętli b[i]->wczyt(plik); Tu się wywala.
A z tym typeid - to myślałem też żeby właśnie zrobić inaczej, funkcje stayczne wczytywania dla każdej podklasy ale to bym musiał wiedzieć jaki obiekt jest w jakiej linicje, bo zeby ten typeid uzyc to najpierw te dane trzeba wczytać.
Sorry za chaos w mojej wypowiedzi.

1

Jako pierwszy element zapis ma zapisać: typeid(tab[i]).name() (może być inny klucz)
Przy odczycie najpierw odczytuje ten wiersz po tym znajduje jaka klasa mu odpowiada i wywołuje metodę tworzącą właśnie tą klasę.

0

Ah, już zrozumiałem :) Zrobiłem tak jak kazałeś - i jak w pętli jest "typeid(tab[i]).name()" to zawsze wyswietla "class bazowa *" [w końcu to jest **tab], więc zrobiłem następujący "myk", żeby nie wyswietlal wskaznika na bazową tylko od razu nazywał po "imieniu" pochodną- typeid(*tab[i]).name() - ale w tym wypadku program znowu się wykrzacza :/

0

Cały czas się wykrzacza, kod błędu:
"First-chance exception at 0x74a2277c in program.exe: Microsoft C++ exception: std::bad_typeid at memory location 0x010ff770..
Unhandled exception at 0x74a2277c in program.exe: Microsoft C++ exception: std::bad_typeid at memory location 0x010ff770.."

EDIT: nawet z tym "typeid(*(b[i])).name()"

1

Więc albo masz NULL w tablice albo klasa bazowa nie ma żadnej metody wirtualnej, zaś powinna mieć przynajmniej wirtualny destruktor.

0

Klasa bazowa ma wiele metod czysto wirtualnych, więc to odpada. Już nie wiem co mam robić, wklejam tą funkcję na pastebina, może to coś rozjaśni co tam nie tak:
http://pastebin.com/mGG38c7p

1

Przecież napisałem wyraźnie:

_13th_Dragon napisał(a):

Więc albo masz NULL w tablice ...

No i masz te NULL'ie:

for(int i=0;i<roz;i++) b[i]=NULL;
0

Racja, nie zauważyłem. Jednak gdy usunąłem tą linijke z kodu to i tak nic nie daje :(

1

Bo teraz masz śmiecie które próbujesz skonwertować na obiekt klasy.
Może to ci coś wyjaśni:

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

class Bazowa
  {
   public:
   Bazowa() {}
   virtual ~Bazowa() {}
  };
  
class Pochodna1:public Bazowa
  {
   public:
   Pochodna1() {};
  };

int main()
  {
   Bazowa *b=new Pochodna1();
   
   cout<<typeid(*b).name()<<endl;
   cout<<typeid(Pochodna1).name()<<endl;
   
   return 0;
  }

http://ideone.com/xzrWbg

0

No ja rozumiem, tylko teraz już się trochę pogubiłem. Bo mój główny problem jest taki, że nie wiem jak wczytać do tablicy dane z linijki pliku. Sprawdzić typeid-em mogę dopiero wtedy, gdy dane już będą " w " programie, dobrze rozumiem? Można zawsze zrobić getline ale to to mi dużo nie pomaga.

0

W pliku musi już być JUŻ wpisany odpowiedni klucz, możliwe że jest już wpisany, te numery na początku mogą być właśnie tym kluczem a mogą być zwykła liczbą porządkową.
Klucz zapisuje się przy zapisie.

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