xxx does not name a type, mimo #include

0

[c++][CODEBLOCKS]
Cześć, mam dosyć duży problem. Starałem się już pytać wujka Google, ale problem jest dosyć nietypowy.... Mianowicie staram się napisać menu główne do pewnej aplikacji... Mam dwie klasy Main_menu oraz menu_option... jedna w plikach: MAIN MENU.h oraz MAIN MENU.cpp a druga w menu_option.h oraz menu_option.cpp. Problem wywala w pliku MAIN MENU.h a oto ten plik:

#ifndef MAIN_MENU_H_INCLUDED
#define MAIN_MENU_H_INCLUDED

#include "menu_option.h"

using namespace std;

class Main_menu
{
private:
    string bg_path;
    string option_bg_path[3];
    string selection_path;
    menu_option option[3];
    SDL_Surface* selection;
    int selected;

public:
    Main_menu();
    void show();
    void select(int s) {selected = s;}
    int current_selection() { return selected;}
    ~Main_menu();
};

#endif // MAIN_MENU_H_INCLUDED
 

Błąd to: 'menu_option' does not name a type! ... Próbowałem nawet napisać deklarację klasy menu_option przed definicją Main_menu ale znów pojawił się bład: field 'option' has incomplete type!

I uwaga teraz gwóźdź programu! Gdy skasowałem tę linijkę, skompilowałem nie było żadnego problemu (było to przed rozpisanie funkcji składowych), gdy jednak wpisałem ponownie tę linijkę to... wszystko skompilowało się również bez problemu... O_O
Problem niestety powrócił gdy rozpisałem funkcję (choć w czasie operowania na tablicy option[] kompilowałem wielokrotnie i nic się nie działo), chciałem przejść do innej części pisania programu to wrócił stary bład. Dołączam jeszcze plik menu_option.h:

#ifndef MENU_OPTION_H_INCLUDED
#define MENU_OPTION_H_INCLUDED

#include "nagl.h"

using namespace std;

class menu_option
{
private:
    SDL_Surface* text;
    int x;
    int y;

public:
    menu_option();
    bool load_option(string path);
    void add_xy(int xx, int yy)
    {
        x = xx;
        y = yy;
    }
    void show();
    ~menu_option();
};


#endif // MENU_OPTION_H_INCLUDED
 

Ponowne włączenie i wyłączenie CODEBLOCKS'a nic nie dało :(. Kompiluje na XP.

0

pokaż nagl.h

0

ok:

#ifndef NAGL_H_INCLUDED
#define NAGL_H_INCLUDED

#include "SDL.h"
#include "SDL_image.h"
#include "SDL_ttf.h"
#include <string>
#include <vector>
#include <windows.h>

#include "MAIN MENU.h"
#include "SDL MANAGEMENT.h"

using namespace std;

extern bool wyjscie;
extern const int SCREEN_W;
extern const int SCREEN_H;
extern const int SCREEN_BPP;
extern SDL_Event event;
extern SDL_Surface* screen;
extern SDL_Surface* background;
extern TTF_Font* font;

SDL_Surface* load_image(string filename);
void apply_surface(int x, int y, SDL_Surface *zrodlo, SDL_Surface *cel, SDL_Rect *clip=NULL);

#endif // NAGL_H_INCLUDED

i jescze SDL_MANAGEMENT:

#ifndef SDL_MANAGEMENT_H_INCLUDED
#define SDL_MANAGEMENT_H_INCLUDED
#include "nagl.h"
namespace SDL_MANAGEMENT
{
    bool Start_SDL();
    void Stop_SDL();
    bool init();
    bool load_files();
    void clean_up();
}
#endif // SDL_MANAGEMENT_H_INCLUDED

Hah zaraz się posikam xD.... Ująłem w komentarz linię co nawala. Cały plik MAIN MENU.cpp też tak aby program się skompilował i nie wywalał błędu xD... Skompilowało się wszystko jest ok... Następnie usuwam komentarze, kompiluję... i wszystko gra xD hah no ja nie mogę. Ma ktoś pomysł o co w ogóle chodzi? Podejrzewam że może plik menu_option.h albo menu_option.cpp albo którykolwiek się nie chce skompilować i muszę robić tak aby po każdej zmianie kompilował się a dopiero później używać tych obiektów.

0

Pewnie wystarczyło wyczyścić projekt i skompilować całość jeszcze raz

0

No cóż myślałem że to wina środowiska więc przeniosłem się na VC++ 2010 ale problem nadal jest. Niestety dosyć mocno mi przeszkadza w pracy i podejrzewam, że błędem jest niepoprawne includowanie... Moglibyście mi podać jakieś linki... albo rady jak zmienić ten projekt i czego się wystrzegać na przyszłość?

0
  1. Wyprostuj najpierw te zależności, bo chyba są cykliczne:

main_menu.h -> menu_option.h -> nagl.h -> MAIN_MENU.h
nagl.h -> SDL MANAGEMENT.h -> nagl.h

  1. nie powinno się w *.h włączać niczego, co zbędne do skompilowania pliku *.h:

np. nagl.h jest niepotrzebnie włączane do SDL_MANAGEMENT.h

  1. nie używaj "using" w nagłówkach

  2. trochę wiedzy ogólnej i wytycznych na ten temat:
    http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml
    http://nepsweb.co.uk/pgtcpp/namespace.htm

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