mmastrocinque
mmastrocinque

Reputation: 43

Enum serialization? c++

I'd like to start off I'm a beginner overall and so I'm probably not seeing something.

My main goal is to be able to output an object of a defined class to a file to be read in another instance.

i.e

Player obj is written to a file including all its variables. ex hp. gp, def But I also have two enumerated typed

enum HERO {MAGE, WARRIOR, ROGUE};/ enum RACE {HUMAN, ORC, ELF, DWARF, GNOME};

I've been poling around and found that overloading the << and >> operators would be a way to do this. My issue is that the >> operator does not like my HERO and RACE types.

Here's where I stand.

Player.h

#pragma once
#include <iostream>

enum HERO {MAGE, WARRIOR, ROGUE}; 
enum RACE {HUMAN, ORC, ELF, DWARF, GNOME}; 
using namespace std;

class Player
{
public:
Player();
    Player();
int returnHP();
int returnATK();
int returnDEF();
int returnGP();
HERO returnCLASS();
RACE returnRACE();
int setHP(int x);
int setGP(int x);
int setATK(int x);
int setDEF(int x);
HERO setCLASS(HERO x);
RACE setRACE(RACE x);
void setNAME(string namei);


private:
int hp;
int gp;
int def;
int atkdmg;
char name[30];
HERO playerClass;
RACE playerRace;
friend istream& operator >> (istream& in, Player& obj);
friend ostream& operator << (ostream& out, const Player& obj);
 };

Player.cpp

#include "Player.h"
#include <iostream>
#include <string>

using namespace std;

Player::Player(){

    hp = 0;
    gp = 0;
    def = 0;
    atkdmg = 0;
    strcpy(name,"noname");
    playerClass = WARRIOR;
    playerRace = HUMAN;


}




istream& operator >> (istream& in, Player& obj)
{
in >> obj.hp;
in >> obj.gp;
in >> obj.def;
in >> obj.atkdmg;
in >> obj.name;
in >> obj.playerRace;
in >> obj.hp;

return in;
}
ostream& operator << (ostream& out, const Player& obj)
{
out << obj.hp;
out << obj.gp;
out << obj.def;
out << obj.atkdmg;
out << obj.name;
out << obj.playerRace;
out << obj.hp;
return out;
}

I understand that this probably looks like garbage but it's all being self taught. Any help is appreciated! Thanks in advance!

Upvotes: 3

Views: 5162

Answers (1)

Martin J.
Martin J.

Reputation: 5118

The simplest way to solve your problem is to define the stream operators for your enum classes before you define them for your Player class. For instance, for RACE:

istream& operator >> (istream& in, RACE& race)
{
    unsigned u = 0;
    in >> u;
    //TODO: check that u is a valid RACE value
    race = static_cast<RACE>(u);
    return in;
}

ostream& operator << (ostream& out, RACE race)
{
    //TODO: check that race is a valid RACE value
    unsigned u = race;
    out << u;
    return out;
}

The output operator should also be defined, for compatibility/symmetry reasons.

Upvotes: 3

Related Questions