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