• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[C++] klasa nie widzi klasy. (Opis)

Object Storage Arubacloud
0 głosów
835 wizyt
pytanie zadane 7 kwietnia 2018 w C i C++ przez Hiskiel Pasjonat (22,830 p.)
edycja 7 kwietnia 2018 przez Hiskiel

Witam.

Mam sobie taką sytuację:

class File : FileMaster{
   public:
      ...
   private:
      coś do czego musi mieć dostęp FileMaster
};

class FileMaster{
   public:
      XY(File &f);
   private:
      vector<File> Files;
};

 

Chyba wiecie jaki jest błąd. "Expected class name before { token". Nie widzi klasy po jakiej ma dziedziczyć.

Za to kiedy dodam przed oboma klasami

class FileMaster;

to wywala mi błąd

error: invalid use of incomplete type 'class FileMaster'
note: forward declaration of 'class FileMaster'

Nie wiem co mogę z tym zrobić :/.
 

2 odpowiedzi

0 głosów
odpowiedź 7 kwietnia 2018 przez Patrycjerz Mędrzec (192,320 p.)
Klasa pochodna podczas dziedziczenia musi znać definicję klasy bazowej, inaczej sama byłaby typem niekompletnym. Myk z forward declaration działa bardziej dla wskaźników i referencji.
komentarz 7 kwietnia 2018 przez Patrycjerz Mędrzec (192,320 p.)
Ale nadal to nie ma sensu. Nie wiem, czy rozumiesz sens dziedziczenia. Rozszerza ono klasę pochodną o klasę bazową. Pola `FilePath`, `FileName`, `FileID` i `FStringName` znajdują się w klasie File, a ty mówisz, że klasa FileMaster będzie miała dostęp do tych pól po dziedziczeniu. W jaki sposób, jeśli przed i po dziedziczeniu te pola znajdują się w File, gdyż ta klasa sama je definiuje.

Abstrahując od dziedziczenia, klasa FileMaster nie będzie miała dostępu do prywatnych pól File, do tego są potrzebne gettery.
komentarz 7 kwietnia 2018 przez Hiskiel Pasjonat (22,830 p.)
Tak w zasadzie, to tutaj sobie chyba coś narzucilem. FileMaster zrobiłem chyba tylko po to, żeby nie wywalało błędu "multiple definition od 'Files'". Chyba będę musiał na nowo to zaprojektować, ale nie wiem co z tym błędem.
komentarz 7 kwietnia 2018 przez Patrycjerz Mędrzec (192,320 p.)
Proszę cię więc od początku, abyś podał cel działania tego kodu, a ja wtedy spróbowałbym stworzyć projekt klas. Oczywiście nie nalegam, twój program, twoje zasady.
komentarz 7 kwietnia 2018 przez mokrowski Mędrzec (155,460 p.)

@Patrycjerz, Myk z forward declaration działa bardziej dla wskaźników.

Dla referencji również.

komentarz 7 kwietnia 2018 przez Patrycjerz Mędrzec (192,320 p.)
Napisałem o tym w jednym z komentarzy.
0 głosów
odpowiedź 7 kwietnia 2018 przez mokrowski Mędrzec (155,460 p.)

Pomijając sedno dyskusji o możliwości przemyślenia czy kod który tworzysz ma sens, dla użycia wskaźników i referencji, możesz stosować zapowiedź typu.

Tak więc kod.. 

class File;

class FileMaster{
    public:
        void AddFile(const File &F) const;
        void DeleteFile(const short pos, const File &F);
        std::string GetFName();
        std::string GetFPath();
        short GetNewId();
    private:
        std::vector<File> Files;
};

class File : public FileMaster{
    public:
        File(const std::string &Path, const short ID, const std::string &StringName);
        ~File();
        File& operator=(const File &r);
        bool Copy(const std::string &path) const;
        bool Move(const std::string &path);
        bool Delete();
        bool Show();
    private:
        std::string FilePath;
        std::string FileName;
        short FileID;
        std::string FStringName;
};

Swobodnie się skompiluje. Tylko przemyśl czy z całą pewnością ten efekt współpracy obiektów chcesz osiągnąć.

Podobne pytania

0 głosów
2 odpowiedzi 1,088 wizyt
0 głosów
2 odpowiedzi 1,353 wizyt
pytanie zadane 22 sierpnia 2020 w Java przez Bakkit Dyskutant (7,600 p.)

92,550 zapytań

141,394 odpowiedzi

319,522 komentarzy

61,935 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...