2010-05-22 4 views
2

지금, 내 프로젝트에는 두 개의 클래스와 메인이 있습니다. 두 클래스가 서로 상속하므로 둘 다 forward 선언을 사용합니다. #include 문 바로 아래 첫 번째 객체에서 클래스 정의 앞에 두 개의 enum을 초기화합니다. 그 클래스 내에서 두 enum을 모두 잘 사용할 수 있습니다. 그러나 첫 번째 클래스에서 상속받은 다른 클래스의 열거 형을 사용하려고하면 열거 형이 선언되지 않았다는 오류가 발생합니다. 두 번째 클래스에서 열거 형을 재정의하려고하면 재정의 오류가 발생합니다.C++ 선언 된 클래스 외부에서 전역 적으로 선언 된 enum을 사용할 수없는 이유는 무엇입니까?

나는 심지어 내가 그냥 읽어 트릭을 사용하고 자신의 네임 스페이스에있는 각 열거 퍼팅 시도했다; 그게 아무것도 바뀌지 않았어. '플레이어'가 선언되지 않은 말하는 오류가 대신

void AddPlayer(Player::Enum playerNumber); 

과 :

#ifndef CLASSONE_H 
#define CLASSONE_H 

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

#endif 

그런 다음 두 번째 클래스 내부 앞에서 선언 열거를 사용하려고 : 여기

은 예입니다 .

+0

이것을 보여줄 수있는 간단한 코드를 보여줄 수 있습니까? – WhirlWind

+0

두 번째 클래스는 # "Classone.h"를 포함합니까? – Eclipse

+0

예, classone에 classtwo가 포함되어 있습니다. – Roderick

답변

4

나는 당신이 당신의 코드를 보지 않고 발생하는 어떤 문제가 있는지 모르겠지만,이 컴파일 :

  1. 만들기 : 클래스 정의 내에 정의 된 열거 함께 보는

    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; 
    } 
    

    두 가지를 공개적으로 사용할 수있게하려면 공개로 선언해야합니다.

  2. 정의 된 클래스가 아닌 다른 곳에서 참조 할 때 클래스 이름을 사용하여 열거 형 및 값의 이름을 한정합니다.
  3. 편집이

: 당신이 기본 클래스와 파생 클래스가있을 때

좋아, 문제가 열거 형과는 아무런하지만 포함 오히려 순서를 가지고 있지 만 파생 클래스는 기본에 대해 알 필요가 클래스 :

기본 클래스 헤더 :

#ifndef BASE_H 
#define BASE_H 

enum BaseEnum 
{ 
}; 

class Base 
{ 
}; 
#endif 

파생 클래스 헤더 :

#ifndef DERIVED_H 
#define DERIVED_H 

#include "Base.h" 

class Derived 
{ 

    void Func(BaseEnum be); 
}; 
#endif 
+0

Gotcha.문제는 필자가 관리자를 작성하기 전에 파생 클래스를 작성한 것이므로 기본 클래스에서 필요로하는 경우에도 파생 클래스의 파일에서 열거 형을 선언했습니다. 전방 선언이 순서대로 될 것이라고 생각했지만, 그렇지 않았습니다. #include "classtwo"를 제거하고 기본 클래스로 열거 형을 옮겨서 코드를 컴파일 할 수있었습니다 (클래스 선언에 classtwo의 벡터가있을 수 있도록 앞으로 선언문을 남겨 두었습니다). – Roderick

관련 문제