Expected class-name before '{' token

0

Witam, mam problem ze znalezieniem błędu ( tzn. najpewniej brakuje mi wiedzy):

expected class-name before '{' token
Main w skrócie:(Main.cpp)

#include<iostream>
#include "Postac.hpp" // Wynik błędu: in file included from Postac.hpp:3      from  Main.cpp // odnosi się do tej linii
using namespace std;
int main()
{
 Potwor smok;
int o;
cin>>o;
return 0;
}

Postac.hpp:

#ifndef Postac_hpp
#define Postac_hpp
#include "Potwor.hpp"

class Postac
{
      protected:   
                   int pw;
      public:
                   int zmienna_pw;
                   
      };
#endif

Potwor.hpp:

#ifndef Potwor_hpp
#define Potwor_hpp

class Potwor : public Postac
{                                        // W tej linijce błąd: Expected class-name before '{' token 
      
      };
#endif

Proszę o wytłumaczenie co jest źle i dlaczego.

0

Twoja metoda główna main () nie jest w żadnej klasie. A powinna być.

dokładnie o tym mówi komunikat błędu. Polecam na przyszłość poszukać czegoś w Google, bo za pomocą treści komunikatu. Będzie szybciej niż pisać na forum i czekać na odpowiedź.

3

Twoja metoda główna main () nie jest w żadnej klasie. A powinna być.
Whaaat? Tożto wierutna bzdura.

Masz odwrotnie includy. w Potwor.hpp nie masz widocznej klasy Postac, a próbujesz po niej dziedziczyć. W momencie parsowania, dla kompilatora Postac nie jest nazwą klasy (class name), której oczekuje przed tokenem {.

0

1 zdanie jest nie ważne. Nie zauważyłem że to cpp. Idę spać zamiast gadać głupoty ;-)

Za to reszta o Google ciągle aktualna...

0

Thx, chyba działa.
Zmienione:

  • main:#include "Postac.hpp" na #include "Potwor.hpp"
  • Potwor.hpp: dodane: #include "Postac.hpp"
  • Postac.hpp: odjęte: #include "Potwor.hpp"
    Podsumowywując:
    Czy dobrze zrozumiałem, że najpierw do maina należy zincludować wszystkie nagłówki znajdujące się na gałęziach drzewa ( od dziedziców nieposiadających innych dziedziców), a potem przesuwamy się w dół drzewa odnosząc w kolejności dziecko->rodzic?
2

Nie do końca.

W każdym miejscu powinieneś mieć wyłącznie nagłówki, których niezbędnie potrzebujesz (polecam przy okazji http://jonjagger.blogspot.co.uk/2013/04/the-include-test.html - wcale nie trzeba tak dużo nagłówków jak by się mogło wydawać). Nie więcej, nie mniej. Dzięki temu kolejność pojawiania się nagłówków nie będzie miała znaczenia (pomijając te definiujące makra, jak <windows.h>)

Jeśli w main.cpp korzystasz z Potwor - inkludujesz go. Jeśli nie - nie. W Potwor korzystasz z Postac - include musi się pojawić. itd.

2

Pokaż jak zrobiłeś.
Skoro piszesz: - "... najpierw do maina należy zincludować ..." -to źle zrozumiałeś.
Powinieneś zrobić to tak że nie ma znaczenia w jakiej kolejności co dodajesz.

postac.hpp -> brak
postac.cpp -> #include "postac.hpp" // ewentualnie kiedy się pojawi ten plik cpp
potwor.hpp -> #include "postac.hpp"
potwor.cpp -> #include "potwor.hpp" // ewentualnie kiedy się pojawi ten plik cpp
maion.cpp -> #include "postac.hpp" #include "potwor.hpp" // w dowolnej kolejności
0

main:
#include "Potwor.hpp"
potwor:
#include "Postac.hpp"
postac:
nie includuje niczego
Teraz wydaje mi się, że rozumiem, wcześniej myślałem że dodaje się na odwrót, np przy dziedziczeniu: ( klasa po której się dziedziczy) postac-> #include "potwor.hpp" (klasa dziedzicząca), zasugerowałem się schematami przy opisach dziedziczenia.
Dobranoc.

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