내부 클래스를 어떻게 선언합니까? [복제]
가능한 중복 :
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
'IT story' 카테고리의 다른 글
개념적으로 게임에서 재생은 어떻게 작동합니까? (0) | 2020.06.17 |
---|---|
Python 3.x 정수의 경우 비트 시프트보다 2 배 빠릅니다. (0) | 2020.06.17 |
중복 키 업데이트시 삽입과 동일 (0) | 2020.06.17 |
C # 8 어레이 슬라이싱 기능의 새 hat-operator 인덱스가 0에서 시작하지 않는 이유는 무엇입니까? (0) | 2020.06.17 |
메소드 그룹 대리자를 통해 호출 될 때 GetType ()이 유형을 찾을 수없는 이유는 무엇입니까? (0) | 2020.06.17 |