C++ Problem

08/06/2013 16:43 Midgards#1
Hallo,

Ich bin grade dabei mir ein kleineres Spiel in C++ zu schreiben.
Hierbei bin ich aber leider wegen einem Fehler hängen geblieben:

Quote:
error C2143: Syntaxfehler: Es fehlt ';' vor '*'
und
Quote:
error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
Beide Fehler treten in folgender Datei bei der Deklaration von "*login" auf:
Code:
#ifndef MENU_MANAGER_H
#define MENU_MANAGER_H

#include <SFML\Graphics.hpp>

//Menüs inkludieren
#include "login.h"

enum Menus { Login, Character_Selection };

class menu_manager
{
	public:
		menu_manager(sf::RenderWindow *_window);
		menu_manager(sf::RenderWindow *_window, Menus _activeMenu);
		~menu_manager();

		void LoadData();
		void Update();
		void Render();
		void UnloadData();

	private:
		Menus activeMenu;
		sf::RenderWindow *window;

		login_menu *login;
};

#endif
Hier noch die inkludierten Header:
Code:
#ifndef LOGIN_MENU_H
#define LOGIN_MENU_H

#include "menu.h"

class login_menu : public menu
{
	public:
		login_menu(sf::RenderWindow *_window);
		~login_menu();

		void LoadData();
		void Update();
		void Render();
		void UnloadData();
};

#endif
Code:
#ifndef MENU_H
#define MENU_H

#include "menu_manager.h"

class menu
{
	public:
		void LoadData();
		void Update();
		void Render();
		void UnloadData();

	protected:
		sf::RenderWindow *window;
};

#endif
Irgendwie bin ich grade blind und sehe den Fehler nicht...
08/06/2013 17:32 .SkyneT.#2
In welcher Zeile treten die Fehler auf ?
08/06/2013 17:58 Midgards#3
Zeile 27
08/06/2013 18:04 .SkyneT.#4
Quote:
Originally Posted by Midgards View Post
Zeile 27
Wäre nett, wenn du das in dem geposteten Code irgendwie
kennzeichnest.
08/06/2013 18:10 Midgards#5
Code:
#ifndef MENU_MANAGER_H
#define MENU_MANAGER_H

#include <SFML\Graphics.hpp>

//Menüs inkludieren
#include "login.h"

enum Menus { Login, Character_Selection };

class menu_manager
{
	public:
		menu_manager(sf::RenderWindow *_window);
		menu_manager(sf::RenderWindow *_window, Menus _activeMenu);
		~menu_manager();

		void LoadData();
		void Update();
		void Render();
		void UnloadData();

	private:
		Menus activeMenu;
		sf::RenderWindow *window;

		login_menu *login; //Hier tritt der Fehler auf! <-----
};

#endif
08/06/2013 18:29 Zwawo#6
Welche Codes sind von welcher Datei?

E: Glaubt man den ifndefs, müsstest du noch "login_menu" inkludieren.
E2: Achso, login_menu ist login.h.
08/06/2013 18:35 Midgards#7
Ist eig. an den defines in der jeweils zweiten Zeile zu erkennen, aber hier nochmal alle mit Namen:

menu_manager.h
Code:
#ifndef MENU_MANAGER_H
#define MENU_MANAGER_H

#include <SFML\Graphics.hpp>

//Menüs inkludieren
#include "login.h"

enum Menus { Login, Character_Selection };

class menu_manager
{
	public:
		menu_manager(sf::RenderWindow *_window);
		menu_manager(sf::RenderWindow *_window, Menus _activeMenu);
		~menu_manager();

		void LoadData();
		void Update();
		void Render();
		void UnloadData();

	private:
		Menus activeMenu;
		sf::RenderWindow *window;

		login_menu *login;
};

#endif
menu.h
Code:
#ifndef MENU_H
#define MENU_H

#include "menu_manager.h"

class menu
{
	public:
		void LoadData();
		void Update();
		void Render();
		void UnloadData();

	protected:
		sf::RenderWindow *window;
};

#endif
login.h
Code:
#ifndef LOGIN_MENU_H
#define LOGIN_MENU_H

#include "menu.h"

class login_menu : public menu
{
	public:
		login_menu(sf::RenderWindow *_window);
		~login_menu();

		void LoadData();
		void Update();
		void Render();
		void UnloadData();
};

#endif
Bitte ^^
08/06/2013 19:28 Zwawo#8
In welcher Reihenfolge inkludierst du die header in deiner main.cpp?

Inkludier nur menu_manager.h, dann funktioniert es.
Oder zumindestens so, dass menu_manager.h der erste header ist.
08/06/2013 20:06 Padmak#9
Oder füge in der menu_manager.h oben
Code:
class login_menu;
ein

Padmak
08/06/2013 20:07 Midgards#10
Hier meine aktuelle main.cpp
Code:
#include "menu_manager.h"

int main()
{
	sf::RenderWindow window(sf::VideoMode(1366, 768), "Neverending Storys!", sf::Style::Fullscreen);

	menu_manager manager(&window);

	manager.LoadData();

    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();

			manager.Update();
        }

		window.clear();
		manager.Render();
        window.display();
    }

	manager.UnloadData();

    return 0;
}
Danke Padmak!!!
Hat funktioniert!

Aber was genau war denn jetzt der Fehler?
08/07/2013 12:23 Tasiro#11
Streich das da in menu.h:
Code:
#include "menu_manager.h"
Dein Menü braucht nicht zu wissen, was ein Menüverwalter ist. Wenn dann einfach nur die Datei login.h inkludiert (hineinkopiert) wird, ist login_menu eben in jener Zeile unbekannt.

Davon abgesehen solltest du intelligente Zeiger verwenden und bei Vererbung die Schlüsselwörter virtual und override nicht vergessen. Außerdem gibt es die Möglichkeit, eine Methode als rein virtuell zu kennzeichnen.