[C++] Enum hell

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • LauPro
  • Registratie: Augustus 2001
  • Laatst online: 19-09 16:51

LauPro

Prof Mierenneuke®

Topicstarter
Bij een project heb ik op dit moment de file global.h waar een hoop typedefs staan en ook bijvoorbeeld enums. Maar liever zou ik sommige enums willen hangen onder de class waar ze bij horen.

Echter als ik een enum onder een class hang, dan kom ik er niet meer bij vanuit andere classes. Dit komt omdat in C++03 enums niet forward te declareren zijn en als die class dan door header-ifndef constructies wordt geskipped ontstaat er dus de 'has not been declared' melding.

Ik gebruik wel namespaces al dus dat is op zich in orde. Maar sommige enums worden gedeeld tussen andere classes. Stel bijvoorbeeld een functie getPlayerState() waarbij er een enum terug komt met de status van de player.

Hoe kan ik het beste deze enums declareren?

Inkoopacties - HENK terug! - Megabit
It is a war here, so be a general!


Acties:
  • 0 Henk 'm!

  • DieterVDW
  • Registratie: Juli 2002
  • Laatst online: 12-02-2017
De enums declareren in de klasse zelf, als een public subclass?

(Vergeef mij als ik stommiteiten uitkraam, C++ development is al tijdje geleden..)

Acties:
  • 0 Henk 'm!

  • LauPro
  • Registratie: Augustus 2001
  • Laatst online: 19-09 16:51

LauPro

Prof Mierenneuke®

Topicstarter
Maar dan blijf ik bij het punt dat hij die Enums niet kan opzoeken als die enum is niet gedeclareerd?
C++:
1
2
3
4
5
6
7
8
9
10
11
// File 1
class Player {
public:
    Player();

    enum PlayerState {
        LPD_PLAYER_STOPPED = 1
        ,LPD_PLAYER_PLAYING = 2
        ,LPD_PLAYER_PAUSED = 3
    };
};
C++:
1
2
3
4
5
6
7
8
9
10
// File 2
#include "file1.h"

class PlayerInstance {
public:
    PlayerInstance();

private:
    Player::PlayerState m_state; // Geeft "Player::PlayerState" has not been declared
};

Inkoopacties - HENK terug! - Megabit
It is a war here, so be a general!


Acties:
  • 0 Henk 'm!

Verwijderd

Dat zou prima moeten werken, ervan uitgaande "class Player" in "file1.h" staat en niet in "file1.cpp".

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

LauPro schreef op vrijdag 05 oktober 2012 @ 16:40:
Echter als ik een enum onder een class hang, dan kom ik er niet meer bij vanuit andere classes. Dit komt omdat in C++03 enums niet forward te declareren zijn
Nou is dat in C++11 inderdaad gefixed, maar het lijkt me stug dat dat de culprit is. Waar het om gaat is dat members van forward declared classes niet te declaren zijn, en dat is in C++11 nog steeds het geval. Je bent dan verplicht om de classdefinitie te includen.
en als die class dan door header-ifndef constructies wordt geskipped ontstaat er dus de 'has not been declared' melding.
Heb je dan niet gewoon last van circular dependencies? (header A dependt op header B en header B dependt weer op header A)

Wat je wel kunt doen is een enum buiten de class definieren, maar values alleen binnen de class.
C++:
1
2
3
4
5
6
7
8
9
10
enum Foo { };

class Bar
{
public:
    static const Foo
        fooAap = 1,
        fooNoot = 2,
        fooMies = 3;
};

Nadeel is wel dat je dan zelf moet gaan nummeren.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Bob
  • Registratie: Mei 2005
  • Laatst online: 20-09 11:26

Bob

Ik zet ze meestal buiten de klasse en gebruik dan de c++11 forward declare. Als je dan genoeg aan namespacen doet komt inderdaad alles goed :)

Acties:
  • 0 Henk 'm!

  • LauPro
  • Registratie: Augustus 2001
  • Laatst online: 19-09 16:51

LauPro

Prof Mierenneuke®

Topicstarter
.oisyn schreef op vrijdag 05 oktober 2012 @ 17:21:
Heb je dan niet gewoon last van circular dependencies? (header A dependt op header B en header B dependt weer op header A)
Ja absoluut, er zitten honderden klassenin dit project en in principe forward declair ik altijd alle klasse die ik gebruik binnen een klasse.
Bob schreef op vrijdag 05 oktober 2012 @ 17:30:
Ik zet ze meestal buiten de klasse en gebruik dan de c++11 forward declare. Als je dan genoeg aan namespacen doet komt inderdaad alles goed :)
Dat doe ik dus nu alleen gevolg is dat er dus een stuk of 30 enums in deze namespace heb staan en ik zou graag wat enums willen groeperen.

Op zich is het verder geen ramp alleen soms heeft een enum gewoon helemaal niets te maken met een andere enum en dat ze dan wel in dezelfde scope staan vind ik dan raar.

Maar dus echt wachten op C++0x dus...

Inkoopacties - HENK terug! - Megabit
It is a war here, so be a general!


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11:51
Ik nie snap nie: je header guards zorgen ervoor dat iets niet geinclude wordt als het dat al is. Als dat voor een probleem zorgt (die circular dependencies dus ) lijkt het me dat je sources/classes ander moet organiseren.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dat, plus dat c++11 niets gaat fixen want dan kun je nog steeds geen classmembers declaren zonder de class te definiëren. Want dát is blijkelijk het probleem, niet dat je enums niet kan forward declaren.

Kun je eens een voorbeeld geven van een circular dependency in je code?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1