2014-09-03 3 views
-1

저는 C++을 처음 접했고 정의되지 않았지만 생성자에게 정의되지 않은 참조 오류가 계속 발생했습니다. 나는 이것이 아주 흔한 실수이며 이것에 관해 많은 질문이 있다는 것을 알고 있지만, 각각은 내 것과 조금 다른 것처럼 보이고 나의 문제를 해결할 수 없다.C++의 가상 클래스 생성자에 대한 정의되지 않은 참조

기본적으로 클래스 B에 "실제"하위 클래스 ASub가있는 가상 클래스 인 클래스 A의 인스턴스 변수가 있어야합니다. 또한 클래스 A의 파일은 ~/level1 /에 있고 클래스 B의 파일은 ~/level1/level2 /에 있습니다.

error: undefined reference to 'mynamespace::A::A()' 
error: undefined reference to 'mynamespace::A::~A()' 

아 다음과 같습니다 :

#ifndef A_H__ 
#define A_H__ 

namespace mynamespace { 

class A { 
public: 
    A(); 
    virtual ~A(); 
}; 

class ASub : public A { 
public: 
    ASub(); 
    ~ASub(); 
}; 

} // namespace mynamespace 

#endif // A_H__ 

a.cc은 다음과 같습니다

#include "level1/a.h" 

namespace mynamespace { 

A::A() {} 
A::~A() {} 

ASub::ASub() {} 
ASub::~ASub() {} 

}; // namespace mynamespace 

BH는 다음과 같습니다

나는 다음과 같은 오류가 점점 계속

#ifndef B_H__ 
#define B_H__ 

#include "level1/a.h" 

namespace mynamespace { 

class B { 
public: 
    B(); 
    ~B(); 
    void SetA(A a); 

private: 
    A a_; 
}; 

} // namespace mynamespace 

#endif // B_H__ 

그리고 마지막으로 b.cc은 다음과 같습니다

#include "level1/level2/b.h" 
#include "level1/a.h" 

namespace mynamespace { 

B::B() {} 
B::~B() {} 

void B::SetA(A a) { 
    a_ = a; 
} 

}; // namespace mynamespace 
+2

컴파일해야합니다. b.h를 처리하는 동안 'A'가 선언되지 않습니다. 표시하는 코드는 실제로 작성한 코드가 아닙니다. –

+0

오브젝트 파일을 어떻게 연결하고 있습니까? ('A' 선언이 없으므로'b.h '도 컴파일 할 수 있을지 의심 스럽습니다.) 또한'A_H__'는 이중 밑줄이 있기 때문에 예약 된 식별자입니다. 사용하지 마십시오. –

+0

프로젝트를 빌드하는 데 사용하는 명령 줄을 표시하십시오. – randomusername

답변

1

가 b.h에서 a.h를 포함, 그렇지 않으면 컴파일 할 수 없습니다. 링커 오류가 이전 빌드에서 가능성이 높습니다, 당신이 깨끗한 빌드를 할 필요가 있다고 생각합니다.

관련 문제