2 Stimmen

C++ Warum kann ich ein global deklariertes Enum nicht außerhalb der Klasse verwenden, in der es deklariert wurde?

Im Moment hat mein Projekt zwei Klassen und eine Hauptklasse. Da die beiden Klassen voneinander erben, verwenden sie beide Forward-Deklarationen. Im ersten Objekt, direkt unterhalb der #include-Anweisung, initialisiere ich zwei Enums vor der Klassendefinition. Ich kann beide Enums problemlos in dieser Klasse verwenden. Wenn ich jedoch versuche, diese Enums in der anderen Klasse zu verwenden, die von der ersten erbt, erhalte ich eine Fehlermeldung, dass das Enum nicht deklariert wurde. Wenn ich versuche, die Enum in der zweiten Klasse neu zu definieren, erhalte ich einen Neudefinitionsfehler.

Ich habe sogar versucht, einen Trick anzuwenden, über den ich gerade gelesen habe, und jede Enum in ihren eigenen Namespace zu stellen; das hat nichts geändert.

Hier ist ein Beispiel:

#ifndef CLASSONE_H
#define CLASSONE_H

namespace Player
{
    enum Enum
    {
        One,
        Two,
    };
}

#endif

Dann versuche ich in der zweiten Klasse, die zuvor deklarierte Aufzählung zu verwenden:

void AddPlayer(Player::Enum playerNumber);

und erhalte stattdessen eine Fehlermeldung, dass 'Player' nicht deklariert wurde.

4voto

Eclipse Punkte 43775

Ich bin nicht sicher, welches Problem Sie haben, ohne Ihren Code zu sehen, aber dies kompiliert:

enum OutsideEnum
{
    OE_1,
    OE_2,
};

namespace ns
{
    enum NSEnum
    {
       NE_1,
       NE_2,
    };
}

class Base
{
public:
    enum BaseEnum
    {
        BE_1,
        BE_2,
    };

    void BaseFunc();
};

class Derived
{
public:
    enum DerivedEnum
    {
        DE_1,
        DE_2,
    };

    void DerivedFunc();
};

void Base::BaseFunc()
{
    BaseEnum be = BE_1;
    Derived::DerivedEnum de = Derived::DE_1;
    OutsideEnum oe = OE_1;
    ns::NEEnum ne = ns::NE_1;
}

void Derived::DerivedFunc()
{
    Base::BaseEnum be = Base::BE_1;
    DerivedEnum de = DE_1;
    OutsideEnum oe = OE_1;
    ns::NEEnum ne = ns::NE_1;
}

int main()
{
    Base::BaseEnum be = Base::BE_1;
    Derived::DerivedEnum de = Derived::DE_1;
    OutsideEnum oe = OE_1;
    ns::NEEnum ne = ns::NE_1;
}

Bei Enums, die innerhalb einer Klassendefinition definiert sind, sind zwei Dinge zu beachten:

  1. Vergewissern Sie sich, dass es als öffentlich deklariert ist, wenn Sie es öffentlich zugänglich machen wollen.
  2. Wenn Sie von einem anderen Ort als der Klasse, in der sie definiert ist, auf sie verweisen, verwenden Sie den Klassennamen, um den Namen der Enum und die Werte zu qualifizieren.

EDIT:

Ok, das Problem hat nichts mit Enums zu tun, sondern eher mit der Reihenfolge der Einbeziehung, wenn Sie eine Basisklasse und eine abgeleitete Klasse haben, muss nur die abgeleitete Klasse über die Basisklasse wissen:

Kopfzeile der Basisklasse:

#ifndef BASE_H
#define BASE_H

enum BaseEnum
{
};

class Base
{
};
#endif

Kopf der abgeleiteten Klasse:

#ifndef DERIVED_H
#define DERIVED_H

#include "Base.h"

class Derived
{

   void Func(BaseEnum be);
};
#endif

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X