• 0

[C++] How to return an enumeration?


Question

Hey all, having a bit of trouble here. I've been trying to read and understand other guides on the internet, but they either get way too complex for my fairly simple problem, or they don't solve the problem at all. Basically, I'm trying to create a get method for an enumeration.

enum getGameState() {return eGameStateCurrent;}

I've declared this in the .h file, by the way. When I compile it, I get this error:

  Quote
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

So, I try to change the type, and after a bit of research I try using a const enum return type instead:

const enum getGameState() {return eGameStateCurrent;}

Still though, same error. I've also tried just "const" type, and same thing. I don't fancy using an int, because that would mean I'd have to explain what each enumeration value is when calling upon the accessor, unless there's a way of using an int without having to do all of that.

So, how do I go about returning an enumeration?

Thanks in advance.

Link to comment
https://www.neowin.net/forum/topic/669646-c-how-to-return-an-enumeration/
Share on other sites

7 answers to this question

Recommended Posts

  • 1

Enum itself is not a type, it defines a type much like struct / class do. First, you have to define an enumerator.

// Define Enumerator
enum GameState{ Zero, One, Two, Three, Four };

// Define value
GameState eGameStateCurrent = GameState.One;

// Get value
GameState getGameState(){
	return eGameStateCurrent;
}

// Set value
void setGameState(GameState value){
	eGameStateCurrent = value;
}

Hope this helps.

  • 0
  Xinok said:
Enum itself is not a type, it defines a type much like struct / class do. First, you have to define an enumerator.

// Define Enumerator
enum GameState{ Zero, One, Two, Three, Four };

// Define value
GameState eGameStateCurrent = GameState.One;

// Get value
GameState getGameState(){
	return eGameStateCurrent;
}

// Set value
void setGameState(GameState value){
	eGameStateCurrent = value;
}

Hope this helps.

First of all, thanks for the quick reply. Secondly, I'm defining the enumeration in header, not in the main cpp file, meaning I can't define the enumeration.

GameState.h

public:
	eGAMESTATE getGameState() {return eGameStateCurrent;}

protected:
	enum eGAMESTATE
	{
		eGameStateMenu,
		eGameStateInstruc,
		eGameStateCredits,
		eGameStatePlay,
		eGameStateGmWin,
		eGameStateGmOver
	};

	eGAMESTATE eGameStateCurrent;

However, it still throws me the same error (actually, it throws an extra one, about me needing a ";" before getGameState, but this is obviously due to it not liking eGAMESTATE). Is there a way around this? I really need the enumeration to be a protected attribute.

  • 0

As Xinok said ... enum doesn't create an actual *type*. To return from a function, you'll need an actual type. Just use typedef to create a type for your enum.

#include <iostream>

class EnumTest {
  protected:
	typedef enum eGAMESTATE {
	  eGameStateMenu,
	  eGameStateCredits,
	  eGameStatePlay
	} GAMESTATE;

	GAMESTATE m_GameStateCurrent;

  public:
	EnumTest() : m_GameStateCurrent(eGameStatePlay) {
	}

	GAMESTATE GetGameSate(void) {
	  return m_GameStateCurrent;
	}
};

int main(void) {
  EnumTest eTest;

  return eTest.GetGameSate();
}

  • 0

Having the enumerated type protected, when you have a public method which returns a value of that type, defeats the purpose of enumerating it; the type cannot be accessed outside of the class, meaning you cannot compare the result of the method to the enumerations. Sure, you can check the integral value of it, but it's the difference between having, for example, if (obj.GetGameState() == 2) versus if (obj.getGameState() == ExampleClass::eGameStatePlay) in code which makes use of that public method.

Edited by David Scaife
  • 0

Tareq, you legend, you got it working for me! Thank you! It appears I definitely have a lot, lot more to learn about C++.

However, I've now run into another issue :( You see, the whole reason why I was doing this is so I can grab the value of one enumeration from CGameState and make it the same value in CGame's enumeration.

CGame.h

private:
	typedef enum eGAMESTATE
	{
		eGameStateMenu,
		eGameStateInstruc,
		eGameStateCredits,
		eGameStatePlay,
		eGameStateGmWin,
		eGameStateGmOver
	} GAMESTATE;

	GAMESTATE eGameStateCurrent;

CGameState.h

protected:
	typedef enum eGAMESTATE
	{
		eGameStateMenu,
		eGameStateInstruc,
		eGameStateCredits,
		eGameStatePlay,
		eGameStateGmWin,
		eGameStateGmOver
	} GAMESTATE;

	GAMESTATE eGameStateCurrent;

As you can see, exactly the same. I've made a set method (which works!), but I get this error:

error C2664: 'CGameState::setGameState' : cannot convert parameter 1 from 'CGame::GAMESTATE' to 'CGameState::GAMESTATE'

Considering it has the same type defined in both enumerations (with both enumerations having the same items), shouldn't it just gel? How would I go about getting the value defined from CGameState's eGameStateCurrent enumeration and setting it to be the value for CGame's eGameStateCurrent enumeration?

EDIT: Just read your post David. I see what you mean, but in this case I'm just trying to share between two enumerations with the same values. Surely that still doesn't defeat the purpose, right?

EDIT: I have absolutely no idea why I'm attempting it this way. I have this tendancy to go about things in a rather weird manner and then end up with situations like these! Haha...

I'm going about it a different way, and this way (if I've got everything right), should go ahead without a hitch. Thank you all for your help, though! You've definitely taught me more :)

Edited by The Tjalian
  • 0

If you want to use the same enum, it has to be the SAME enum, not two enums that have the same name... As the compiler points out, CGame::eGAMESTATE and CGameState::eGAMESTATE are two different types and are not convertible to one another. You could force it with a cast but that would be just stupid. The clean solution is to declare that enum in ONE place, and then #include the file containing it whenever you need to use its definition.

For instance if eGAMESTATE is part of CGame, and CGame is in CGame.h, then if you want to use eGAMESTATE in class CGameState, you need to #include "CGame.h" in CGameState.h and reference eGAMESTATE using the fully qualified CGame::eGAMESTATE.

I hope that makes sense.

BTW, in C++, enums already are types, so you don't need to typedef an artificial one. Unless you're writing code that needs to be compatible with C, not your case since you are using classes.

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • Surface Copilot+ PCs coming to classrooms from July 22, turbocharged with on-device AI by Paul Hill Microsoft has announced that it’s launching the new Surface Pro 12-inch and Surface Laptop 13-inch models specifically for education customers from July 22. The Redmond giant said that these devices are being launched as a direct response to feedback from educators who want practicality and ease of use in their diverse classrooms. These are both Copilot+ PCs so teachers and students will be able to leverage the latest AI features thanks to the dedicated Neural Processing Units (NPUs) that allow for on-device AI. The on-device AI, aside from delivering well-known features like Recall, will enable new education features such as a new app Microsoft is working on called Microsoft Learning Zone. Microsoft Learning Zone will allow teachers to create personalized lessons by adapting content from trusted sources like OpenStax, generating interactive games with Kahoot, and tracking students progress. Microsoft expects this to help teachers save time and deliver a more flexible and engaging classroom. Another AI feature that will be available is Click to Do. This lets students highlight text or images and get contextual help. It can be used to summarize a paragraph or explain a graph. To activate it, students can press the Windows key and click. This feature runs entirely on device so inputs to the AI are secure and you don’t need to ever worry about third-parties seeing. Finally, these devices will also have accessibility features such as Voice Access which lets you navigate with speech and Live Captions which provide real-time subtitles and translations for spoken content. These make the devices more inclusive for students with disabilities. Regarding security, these laptops come with the Microsoft Pluton security chip directly integrated into the processor for protecting sensitive data. It can protect data such as passwords and sign-ins, even if your device is stolen. Thanks to automatic Windows Updates, schools never need to worry about falling behind on updates either. With the impending demise of Windows 10 in mid-October, these Surface devices arrive just in time for schools looking for somewhere to upgrade to. Aside from AI features and security, Microsoft is also pushing other key features including easy repair with replacement components at the Microsoft Store and iFixit, their lightweight design and all-day battery life making them ideal for carrying and surviving the school day, and their compatibility with popular education apps such as TestNav, Google Classroom, Minecraft Education, and Adobe Express.
    • Taras Buria, do you think you could write more about Windows Vista? It is always such a pleasure — quite a pleasure — to see it mentioned in the title of a news article. What about an editorial?
    • I gave you an upvote because you are my favorite Neowinian!
  • Recent Achievements

    • Rising Star
      Phillip0web went up a rank
      Rising Star
    • One Month Later
      Epaminombas earned a badge
      One Month Later
    • One Year In
      Bert Fershner earned a badge
      One Year In
    • Reacting Well
      ChrisOdinUK earned a badge
      Reacting Well
    • One Year In
      Steviant earned a badge
      One Year In
  • Popular Contributors

    1. 1
      +primortal
      545
    2. 2
      ATLien_0
      205
    3. 3
      +FloatingFatMan
      170
    4. 4
      Michael Scrip
      149
    5. 5
      Som
      131
  • Tell a friend

    Love Neowin? Tell a friend!