Simple inheritance error: expected class-name before '' token

Started by
6 comments, last by Zakwayda 14 years, 8 months ago
Hello. I started work on a text-based RPG console thingy. I started on the Menu class, and this is a basis of what I have, without all the virtual methods and things. Menu.h

#ifndef MENU_H
#define MENU_H

using namespace std;

class Menu
{
    public:
    Menu();
    virtual ~Menu();

    virtual void Print() const = 0;
    virtual void Choice() = 0;


};


#endif // MENU_H


Menu.cpp

#include <iostream>
#include "Menu.h"

using namespace std;

Menu::Menu()
{
}

Menu::~Menu()
{
}

void Menu::Print() const
{
}

void Menu::Choice()
{
}

MainMenu.h

#ifndef MAINMENU_H
#define MAINMENU_H

class MainMenu : public Menu
{
    public:
    MainMenu();
    virtual ~MainMenu();

    virtual void Print() const;
    virtual void Choice(int choice);



};

#endif // MAINMENU_H



And a similar thing to Menu.h for MainMenu.h. When I try to run it, I get the "error: expected class-name before '{' token" which is rather annoying, and I can't see anything wrong, since it's just simple inheritance. I looked on Google, but those examples were generally circular inclusion. Thanks. -T.C.D EDIT:Ugh. Source tags not working? [Edited by - jpetrie on July 27, 2009 3:45:23 PM]
Advertisement
Source tags do work, it is just you didn't check what are they. And please post where is the error exactly. Do you even include Menu.h in MainMenu.h so base class is known?
Sorry about the source tags, just via a lot of lurking I saw people saying to use "<source>" tags, which I assumed...

And the error just says it expected a class-name before the { token.

And thank you for the last bit-it solved my problem. The only downside to Teach Yourself C++ is that the examples always have classes + main() in 1 file, so I didn't assume you needed to #include the base file. Would I need to #include base class in the derived header and/or .cpp?
EDIT: Thank you also to whoever edited the source tags, unless they auto did it. =P
Thanks.
-T.C.D
Angle brackets are for HTML, square brackets are for non-HTML tags, like our source tags.

You get the error because you don't #include "Menu.h" in MainMenu.h, so the TU being compiling has no idea what a "Menu" is. Give this a read.

Some other notes:
Putting "using namespace std;" is best done at the tightest scope possible; a header file is the worst possible place to do this... please don't.

The designation "= 0" means the method is a "pure virtual," or abstract. You should generally not provide the bodies of these methods -- it is the responsibility of the subclass to implement them.

MainMenu is not implementing the Choice() method from Menu, it's declaring a new virtual method Choice(int).
When deriving (or aggregating), inclusion must occur before derived class definition (this is because compiler must know base / aggregated class size), on the other hand, if new class only points (or refers) to other class object, then only forward declaration is needed before class declaration (in header file) and inclusion is needed only in implementation file (but only if there is actual usage of other class).
You probably don't really want to use inheritance to implement different kinds of menus, and you almost certainly don't want to use it to implement different menus of the same fundamental "kind" (i.e. graphical presentation). Instead, take a data-driven approach: have the menu store menu-items, and give each instance of the menu the items that are needed for that menu.
Thank you everyone, for fixing the problem and the other useful info. :)

One other question, which I seem to get a lot of after posting a topic, is I saw on the Wrathlands tutorial the guy put all the #include "" into a Library.h file. Is this really worth doing?Or is it just easier to type a bit more and put only the #includes needed into the file?
Thanks.
-T.C.D
Quote:Original post by The Communist Duck
Thank you everyone, for fixing the problem and the other useful info. :)

One other question, which I seem to get a lot of after posting a topic, is I saw on the Wrathlands tutorial the guy put all the #include "" into a Library.h file. Is this really worth doing?Or is it just easier to type a bit more and put only the #includes needed into the file?
In general, you should only #include what you need, and no more. If this 'Library.h' file pulls in files that aren't actually needed, then you're probably better off dropping the 'master header' file and just #include'ing each file individually.

More info here.

This topic is closed to new replies.

Advertisement