C ++ 중첩 클래스 선언 오류 전달
-
10-07-2019 - |
문제
클래스 A 내부의 클래스 B를 선언하고 사용하려고 노력하고 A 외부 B를 정의하려고합니다.
Bjarne Stroustrup이기 때문에 이것이 가능하다는 사실을 알고 있습니다.
그의 책 "The C ++ 프로그래밍 언어"에서 이것을 사용합니다.
(예 : 문자열 및 SREP 클래스와 같은 페이지 293 페이지).
그래서 이것은 문제를 일으키는 최소한의 코드입니다.
class A{
struct B; // forward declaration
B* c;
A() { c->i; }
};
struct A::B {
/*
* we define struct B like this becuase it
* was first declared in the namespace A
*/
int i;
};
int main() {
}
이 코드는 G ++에서 다음과 같은 컴파일 오류를 제공합니다.
tst.cpp: In constructor ‘A::A()’:
tst.cpp:5: error: invalid use of undefined type ‘struct A::B’
tst.cpp:3: error: forward declaration of ‘struct A::B’
나는 C ++ FAQ를 보려고 노력했고 내가 얻은 클로즈셋은 여기 그리고 여기 하지만
내 상황에는 적용되지 않습니다.
나도 이것을 읽으십시오 여기에서 내 문제를 해결하지는 않습니다.
GCC와 MSVC 2005는 모두 컴파일러 오류를 제공합니다.
해결책
구조체 B의 정의 후 생성자를 정의하십시오.
다른 팁
표현식 c->i
포인터를 해석합니다 struct A::B
따라서 프로그램 의이 시점에서 전체 정의가 표시되어야합니다.
가장 간단한 수정은 생성자를 만드는 것입니다 A
비 인화 및 정의 후 신체를 제공합니다. struct A::B
.
이것은 정의를 선언과 분리하려는 이유의 좋은 예입니다. 생성자가 A::A()
정의 후에 정의됩니다 struct A::B
.
class A
{
struct B;
B* c;
A();
};
struct A::B
{
int i;
};
A::A() { c->i; }
int main()
{
return 0;
}
흥미롭게도, 나는 Stroustrup 책에 언급 된 293 페이지 ('11 .12 문자열 클래스 ')와 같은 문제에 부딪쳤다.
인쇄 된 책에 제공된 예제는 잘못된 것으로 보이며 구조 SREP의 정의 후에 다음 방법을 인라인으로 제공합니다.
class String {
// ...
void check(int i) const { if (i<0 || rep->sz <=i) throw Range(); }
char read(int i) const { return rep->s[i]; }
void write(int i, char c) { rep=rep->get_own_copy(); rep->s[i]=c; }
...etc...
나는 조금씩 Google에 글을 썼고, 저자의 최신이 문자열 클래스 구현을 여기에서 사용할 수 있음을 발견했습니다. http://www2.research.att.com/~bs/string_example.c
그는이 스레드에서 언급 된 문제를 피하기 위해 이러한 방법이 더 이상 인라인되지 않도록 수정 한 것 같습니다.