2012-12-14 3 views
-1

작동하지 않습니다 내가 가지고있는 다음과 같은 두 개의 클래스 :서로 참조하는 순서 지정 클래스 연결. 앞으로

푸가 생성자 새로운 푸 (이, INT, int)를 호출 푸 (바 *, INT, INT)

과 바

전방 선언 Foo가 Bar.h 및/또는 Foo.h의 Bar로 문제를 해결한다고 가정했습니다.

가 I "m 연타 컴파일하여이.

가 스탠드 (단, 동일한 오류가 두 경우 모두에서 발생)으로하는 연결기 순서는 (리턴 에러 새로운 푸의"정의 참조 "이다) 다음과 같이 푸 후 바. 내가 잘못하고있는 중이 야 무엇인지에

어떤 생각?

를 코드는 대략. 나는 불행하게도 실제 코드 조각

표시 할 수있다
#include Bar.h 

class Bar ; 

class Foo { 
public: 
Foo(Bar* bar, int arg1, int arg2) ; 
void method1() { 
    I access bar->field here 
} 

그리고 줄의 코드는 다음

#include Foo.h 



    class Bar { 
    public: 

    Bar() { 
    Cache* cache = new Cache(this, 0, 0) ; 
    } 
+1

몇 가지 코드를 보여주십시오. 당신이 묘사 한 것은하기 쉽습니다. –

답변

1

그것은 이런 식으로 뭔가를 보일 것입니다 (가드를 포함 밖으로 떠나) :

foo.h

class Bar; 

class Foo { 
    public: 
    Foo(Bar*, int, int); 
}; 

바 .h

class Bar { 
    public: 
    Bar(); 
}; 

foo.cc

#include "foo.h" 
// Note: no need to include bar.h if we're only storing the pointer 

Foo::Foo(Bar*, int, int) { ... } 

bar.cc는

// Note: the opposite order would also work 
#include "bar.h" 
#include "foo.h" 

Bar::Bar() { 
    new Foo(this, int, int); 
} 

하면 링커에서 "정의되지 않은 참조"를 받고 있다면, 당신은 아마 다른 서명 이상으로 Foo::Foo 선언 당신은 그것을 정의했거나 전혀 정의하지 않았거나, 컴파일 된 객체 파일과 연결되어 있지 않습니다.

+0

내 코드와 당신의 차이점은 bar.cc의 헤더 파일보다는 .cc 파일에 헤더를 포함하는 위치 인 것 같습니다. foo.h를 bar가 아닌 bar.cc에 포함해야한다고 말하고있는 것입니다. h? – user1018513

+1

예. 가능한 경우 다른 헤더에서 헤더를 포함하지 마십시오. 또한 컴파일 속도가 빨라집니다. – Thomas

+0

불행히도 여전히 문제가 해결되지 않았습니다. – user1018513