• Create Account

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

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

7 replies to this topic

### #1The Communist Duck  Members

Posted 27 July 2009 - 09:23 AM

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

using namespace std;

{
public:

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

};


#include <iostream>

using namespace std;

{
}

{
}

{
}

{
}


#ifndef MAINMENU_H

{
public:

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

};


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]

### #2noe  Members

Posted 27 July 2009 - 09:32 AM

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?

### #3The Communist Duck  Members

Posted 27 July 2009 - 09:39 AM

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

### #4Josh Petrie  Moderators

Posted 27 July 2009 - 09:42 AM

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).

### #5noe  Members

Posted 27 July 2009 - 09:47 AM

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).

### #6Zahlman  Members

Posted 27 July 2009 - 01:00 PM

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.

### #7The Communist Duck  Members

Posted 27 July 2009 - 09:58 PM

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

### #8scgames  Members

Posted 27 July 2009 - 11:17 PM

Quote:
 Original post by The Communist DuckThank 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.