2012-07-03 2 views
-1

나는 그런C++ 앞으로 선언과 상속

같은 상황

#ifndef _CLASSA 
#define _CLASSA 
class B; 

class A { 
    virtual void addTo(B*) {} 
}; 

#endif 

B.h

#ifndef _CLASSB 
#define _CLASSB 

#include "A.h" 

class B : public A { 
    B(); 
    void addTo(B* b) { 
     // blah blah blah 
    } 
}; 

#endif 

B.cpp

#include "B.h" 

B::B() : A() {} 

MAIN.CPP

A.h이
#include "B.h" 

int main() { 
    A* b = new B(); 
    B* d = new B(); 
    b->addTo(d); 
} 

프로젝트가 컴파일되지 않습니다. A 헤더에서 B를 선언하면 컴파일러는 B.h의 클래스에 대한 기대에 대해 불평합니다. A.h에 B.h 헤더를 포함하면 컴파일러에서 기본 클래스를 확인할 수 없습니다. 이것이 가능한가?

+0

실제 코드는 각 클래스 정의 다음에';'를 생략하고 상속 목록에 악의적 인'class'를 갖고 있습니까? 이 두 구문 오류 모두 컴파일을 방해합니다. –

+0

일반적으로 (a) 문제를 재현하기 위해 컴파일러에 넣을 수있는 실제 코드와 얻는 정확한 오류 (b)를 포함하면 더 나은 답변을 얻을 수 있습니다. –

+0

죄송합니다. 조금 빨리 입력하고 있습니다. I'ts는 지금 고쳤다. – IslandCow

답변

2

예, A.hB.h에 포함하고 앞으로 BA.h에 넣으십시오. 나는 앞으로는 A 헤더에 B를 선언하면

는, 컴파일러는 B.h

당신이 지금 작동합니다 코드를 가지고있는 방식으로 클래스의 기대에 대해 불평. 하지만 실제로 B 메서드 addTo 안에 사용하고있는 것으로 판단됩니다.이 경우 전달 선언으로는 충분하지 않습니다. 구현을 구현 파일로 분리하고 여기에 B을 포함시켜야합니다.

EDIT : DeadMg가 지적한 것처럼 은 유효한 구문이 아니므로 class B : A 또는 class B : public A이 필요합니다.

+3

당신은 그가': class A'라는 사실을 놓치고 있습니다. 구문 오류 – Puppy

+0

@DeadMG이 코드는 실제 코드가 아닙니다. –