• 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

    • Why is it that some people think we have a tinfoil hat mentality, as you put it, just because we don't want AI on our devices? As for MS or any other company looking at everything, it seems to be the thing these days that companies want to know all about us. Can't even go shopping these days without being asked if you have some sort of card that tell them what you are buying and who you are.
    • Until the employer looks right though the AI created letter and notice it is AI created. You will be surprised how many can tell, there is something about an AI created letter that stands out to some people.
    • Snapchat brings new features, including auto-saving for public Stories by David Uzondu Snapchat, which recently expanded to watchOS after a decade, is rolling out new tools for its creators. The company says people are watching more content than ever, so these updates are meant to help creators get more out of that attention. The new features focus on a few key areas: making video editing less of a hassle, showing who is actually watching, and saving posts that used to vanish forever. Video editing on the platform has always been a huge problem. The tools are fine for quick clips, but they get messy if you try to do anything more complex. A new Timeline Editor for creators in the US is coming "soon" to fix this. It shows your video clips in a simple timeline, letting you cut and move parts around without wanting to pull your hair out. You can still add all the usual Lenses and music on top of these edits. For even quicker edits, a "Create a Video" template is now available globally for iOS users. The idea is simple: you look through your saved Memories, pick a handful of photos or videos, and then choose a song from the app's library. After you select a template, Snapchat mashes it all together into a single compilation video for you. But making videos is only part of the job. To help people see if anyone is paying attention, new insights are also available. These stats give a much better idea of how an audience behaves. Instead of just one giant view number, creators can now track "Returning Viewers." This counts how many people watched their content at least 12 times in the last month. Other metrics include the "Spotlight Average View Rate," showing what percentage of a video people finished. You can also see "Views by Traffic Sources," which tells you if people found you from the Discover page, search, or their own feed. Finally, there is a new "Auto-Save Stories to Public Profiles" feature. For years, the whole point of a Snapchat Story was that it was temporary. This new option, which is rolling out to creators globally, automatically saves public Stories to a creator's profile. Snapchat notes that the new feature "helps creators build a lasting collection of their best moments, giving fans a deeper look into their creative journey and making it easier to keep content alive, accessible, and meaningful over time."
    • I did not think it could be removed, all it does is remove the icon, co-pilot is still there as far as I know. Also don't forget the other apps it is in. What is needed is a simple thing to click to remove co-pilot and any AI rubbish from the computer, just like I can on my Mac.
    • Report: Major Siri AI upgrade may arrive with iOS 26.4, delayed to spring 2026 by Sagar Naresh Bhavsar Apple Intelligence, the company's suite of artificial intelligence features, has been nothing short of a headache and an embarrassment. While most Apple Intelligence features were released on time, they still lag far behind the likes of Samsung's Galaxy AI. Also, the big Siri AI upgrade, that was announced during the WWDC 2024 event, is still nowhere to be seen. The company has been trying to cover up the delay by releasing a bunch of small features. During this year's WWDC event, although Siri wasn't mentioned explicitly, Apple's software engineering chief Craig Federighi confirmed that Apple is still working on the Siri upgrade, and it is delayed till 2026. Now, a reliable source has purportedly hinted at when we can expect Apple to release the Siri AI upgrades. According to Bloomberg's Mark Gurman, sources familiar with the matter suggest that Apple is now aiming for iOS 26.4 to launch the big Siri upgrade. Notably, the delays have reportedly been caused by technical challenges and internal disagreements. The upcoming Siri upgrade will make Apple's assistant much smarter and more helpful by using Apple's in-house AI. Siri will be able to understand what's happening on your iPhone's screen and use your data to provide useful responses. The new powers would also enable Siri to perform multi-step tasks and offer more contextual outputs. Originally, the Siri upgrade was expected to launch with the iPhone 16 series. However, it was pushed to spring 2025, and then to May with iOS 18.5. Obviously, none of the that happened, and based on the new information, iOS 26.4 is what rumors are hinting to. This means that the Siri upgrade could launch, possibly in March 2026. Sources claim that Apple had issues combining Siri's older system with the new AI-based system, leading to consistent bugs and glitches. The delay in Siri upgrade also forced Apple to postpone the home hub that was slated to launch in March this year. Vision Pro headset creator Mike Rockwell with Apple's software engineering chief Craig Federighi are leading the charge for Siri LLM, the internal name for the big Siri upgrade. The report also adds that Apple is also working on a chatbot-like app, dubbed as "Knowledge." This project is being led by Robby Walker. But details about it remain scarce.
  • Recent Achievements

    • One Month Later
      POR2GAL4EVER earned a badge
      One Month Later
    • One Year In
      Orpheus13 earned a badge
      One Year In
    • One Month Later
      Orpheus13 earned a badge
      One Month Later
    • Week One Done
      Orpheus13 earned a badge
      Week One Done
    • Week One Done
      serfegyed earned a badge
      Week One Done
  • Popular Contributors

    1. 1
      +primortal
      562
    2. 2
      ATLien_0
      256
    3. 3
      +Edouard
      163
    4. 4
      +FloatingFatMan
      156
    5. 5
      Michael Scrip
      109
  • Tell a friend

    Love Neowin? Tell a friend!