Jump to content

  • Log In with Google      Sign In   
  • 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.

  • You cannot reply to this topic
7 replies to this topic

#1 The Communist Duck   Members   -  Reputation: 154

Like
0Likes
Like

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
#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]

Sponsor:

#2 noe   Members   -  Reputation: 100

Like
0Likes
Like

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?

#3 The Communist Duck   Members   -  Reputation: 154

Like
0Likes
Like

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

#4 Josh Petrie   Moderators   -  Reputation: 3840

Like
0Likes
Like

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

Josh Petrie | Game Developer, Undead Labs


#5 noe   Members   -  Reputation: 100

Like
0Likes
Like

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

#6 Zahlman   Moderators   -  Reputation: 1682

Like
0Likes
Like

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.

#7 The Communist Duck   Members   -  Reputation: 154

Like
0Likes
Like

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

#8 scgames   Members   -  Reputation: 1977

Like
0Likes
Like

Posted 27 July 2009 - 11:17 PM

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.




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.



PARTNERS