IT story

내부 클래스를 어떻게 선언합니까?

hot-time 2020. 6. 17. 07:46
반응형

내부 클래스를 어떻게 선언합니까? [복제]


가능한 중복 :
C ++에서 중첩 유형 / 클래스의 전달 선언

나는 같은 수업을 가지고 있습니다 ...

class Container {
public:
    class Iterator {
        ...
    };

    ...
};

다른 곳에서는 Container :: Iterator를 참조로 전달하고 싶지만 헤더 파일을 포함하고 싶지 않습니다. 클래스를 선언하려고하면 컴파일 오류가 발생합니다.

class Container::Iterator;

class Foo {
    void Read(Container::Iterator& it);
};

위의 코드를 컴파일하면 ...

test.h:3: error: ‘Iterator’ in class ‘Container’ does not name a type
test.h:5: error: variable or field ‘Foo’ declared void
test.h:5: error: incomplete type ‘Container’ used in nested name specifier
test.h:5: error: ‘it’ was not declared in this scope

Iterator 클래스를 선언하는 헤더 파일을 포함 할 필요가 없도록이 클래스를 어떻게 선언 할 수 있습니까?


이것은 단순히 불가능합니다. 컨테이너 외부에 중첩 구조를 선언 할 수 없습니다. 컨테이너 내에서만 선언 할 수 있습니다.

다음 중 하나를 수행해야합니다.

  • 클래스를 중첩되지 않도록 설정
  • 중첩 클래스가 먼저 완전히 정의되도록 선언 순서를 변경하십시오.
  • 함수에서 사용하고 중첩 클래스에서 구현할 수있는 공통 기본 클래스를 작성하십시오.

불완전한 클래스 작업에서 내부 클래스를 선언하는 것을 믿지 않습니다 (클래스 정의가 없으면 실제로 내부 클래스 있는지 알 수있는 방법이 없습니다 ). 따라서 앞으로 선언 된 내부 클래스와 함께 컨테이너 정의를 포함해야합니다.

class Container {
public:
    class Iterator;
};

그런 다음 별도의 헤더에서 Container :: Iterator를 구현하십시오.

class Container::Iterator {
};

그런 다음 # 컨테이너 헤더 만 포함하십시오 (또는 앞으로 선언하는 것에 대해 걱정하지 말고 둘 다 포함하십시오).


원하는 것을 정확하게 수행 할 수있는 방법은 없지만 템플릿을 사용하려는 경우 해결 방법이 있습니다.

// Foo.h  
struct Foo
{
   export template<class T> void Read(T it);
};

// Foo.cpp
#include "Foo.h"
#include "Container.h"
/*
struct Container
{
    struct Inner { };
};
*/
export template<> 
  void Foo::Read<Container::Inner>(Container::Inner& it)
{

}

#include "Foo.h"
int main()
{
  Foo f;
  Container::Inner i;
  f.Read(i);  // ok
  f.Read(3);  // error
}

바라건대,이 관용구가 당신에게 유용 할 것입니다 (그리고 컴파일러가 EDG 기반이며 내보내기를 구현하기를 바랍니다)).

참고URL : https://stackoverflow.com/questions/1021793/how-do-i-forward-declare-an-inner-class

반응형