• 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

    • Hahaha! I've been arguing with my dad for 10 years (he's pro-Tesla, I'm impartial as I don't trust a lot of the people and their tech in these robotaxis) about this whole charade. His continued argument is the cost factor (economies of scale principle) and the associated technology (different dependencies of which reduced production cost is a potential outcome thus feeding into the reduced cost argument). And my rebuttal is the broad-market trust factor -- it's often not the most innovative or first-mover that wins (Uber and Tesla have been arguing/investing in autonomous vehicles forever) but rather the option that builds the most trust amongst the commonwealth. VW and Toyota are not the first or best or cheapest cars on the road, but they've built a long of continued trust to the scales of being the largest automakers by volume worldwide. Supercar makers have the highest profit margins, Tesla has the highest stock price, but VW and Toyota have the sales volumes. As it stands, the writing is on the wall... No matter what advantages Tesla had in their ambitions, they have an even-longer road to repair public trust than any other robotaxi provider (foreign or domestic). If the trend continues, everyone will realise that their market valuation is based on their non-automotive efforts (including not robotaxis or consumer humanoids).
    • Or just use Linux and live free. For the anti-Linux brigadiers reading this, this is the part where you go: Nooo! I love being digitally abused by Microsoft 😡😡 /s
    • Windows 10 KB5061087 fixes incorrect version reporting, Start menu bugs, and more by Taras Buria Following the news about a free year of Windows 10 security updates (there are some strings attached), Microsoft is releasing a new non-security update for its decade-old operating system. Today, Microsoft shipped KB5061087 (build number 10945.6036) with a pretty long list of fixes. In today's update, Windows 10 users get fixes for the Settings app incorrectly reporting Windows version, issues with Multi-Function printers with dual protocol interface, disappearing jump list in the Start menu, and other bugs. Here is the changelog: [Mobile Operator Profiles] Updated: Country and Operator Settings Asset (COSA) profiles. [App Platforms and Frameworks] Fixed: An issue affecting Component Object Model (COM) functionality on Windows platforms. Remote COM activations were failing with error 0x8001011. Updated: The version of the curl tool included in Windows is updated to v8.13.0. [Authentication Platform] Fixed: An issue affecting the device registration in Entra ID Windows Account Manager (WAM) plugin. [Input and Composition] Fixed: An issue affecting the complete removal of unused language packs and Feature on Demand (FOD) packages. This issue led to unnecessary storage use and increased Windows update installation time. [Print and Peripherals] Fixed: An issue affecting USB-connected Multi-Function printers with dual protocol interfaces. Scanning failed and prevented using the built-in scanning functionality in the operating system. [Start Menu] Fixed: An issue causing jump lists to disappear from the Start Menu. Fixed: An issue where the Start Menu was not starting after installing an update. [WinSaS] Fixed: Settings > System > About incorrectly shows version 2009 instead of version 22H2. Change of behavior: To maintain DMA compliance in the European Economic Area (EEA), when a new default browser is set, it is automatically pinned to the Taskbar and Start menu. Change of behavior: Associates HTTP and .pdf file types when setting default browser. [Servicing] Fixed: An issue where Kiosk devices using the ForceAutoLogon configuration and Shift Override might stop responding with a blue screen after being locked and unlocked by support administrators. [File Server] Fixed: An issue where the system may stop responding when acknowledging an Oplock break request on resources located on SMB shares. Known issues include a single bug with Noto fonts appearing blurry in Chromium-based browsers such as Edge or Chrome. For now, the only fix is to set your screen scaling to 125% or higher. As usual, feel free to skip KB5061087 if you do not need any of those fixes. Non-security updates are optional, and they eventually arrive with monthly Patch Tuesday updates. You can get KB5061087 from Windows Update or the Microsoft Update Catalog using this link.
    • Governments should be encouraging users to move to Linux instead of creating unnecessary eWaste with great and still-capable machines. Of course, that's presuming they actually give a damn after all their talks of "global warming"/"climate change"/"carbon capture" and those weren't all just PR talks.
    • Except now you need to use a MSA account to do that... one step closer to Windows 11
  • Recent Achievements

    • Week One Done
      DrRonSr earned a badge
      Week One Done
    • Week One Done
      Sharon dixon earned a badge
      Week One Done
    • Dedicated
      Parallax Abstraction earned a badge
      Dedicated
    • First Post
      956400 earned a badge
      First Post
    • Week One Done
      davidfegan earned a badge
      Week One Done
  • Popular Contributors

    1. 1
      +primortal
      605
    2. 2
      ATLien_0
      225
    3. 3
      Michael Scrip
      168
    4. 4
      +FloatingFatMan
      154
    5. 5
      Xenon
      137
  • Tell a friend

    Love Neowin? Tell a friend!