문제

클래스 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

그는이 스레드에서 언급 된 문제를 피하기 위해 이러한 방법이 더 이상 인라인되지 않도록 수정 한 것 같습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top