2011-09-23 2 views
6

두 개의 파일 (클래스 X와 클래스 Y)을 포함해야하는 클래스 (A)가 있습니다. 유감스럽게도 클래스 Y는 생성자가 헤더 파일에 클래스 X를 포함해야합니다 인수로서의 클래스 X 형에 대한 포인터.헤더 가드 수수께끼 - .obj 문제로 이미 정의 됨

잠재적 인 문제는 링커 오류가 발생한다는 것입니다. 클래스 A는 클래스 X의 사본 두 개를 사용합니다. 하나는 사용해야하고 다른 하나는 클래스 Y에 있습니다. 이것은 헤더 가드가 사용되지 않는 상황입니다. 내 질문은 - 이것은 순전히 구조적인 문제인가 아니면이 문제를 해결할 수있는 방법인가?

클래스 Y의 헤더 파일에 아무것도 포함하지 않는 것을 선호합니다. 그 밖의 것으로 THAT을 포함시키려는 경우가 있기 때문에 기능 프로토 타입 때문에 필요합니까?

+0

헤더 파일에 비 인라인 함수를 정의하지 않는 한이 값은 문제가되지 않습니다. 대표 코드를 게시 할 수 있습니까? –

+0

실제로 미안하지만 다른 곳에서 오류가 발생했다고 생각합니다. 그럼에도 불구하고, 이것은 배우는 것이 좋습니다. 따라서 헤더 파일에 프로토 타입 만 포함되어 있으면 문제없이 동일한 번호를 포함 할 수 있습니다. – SirYakalot

+1

클래스 정의는 클래스 함수 자체에 인라인되어있는 한 멤버 정의와 함께 정의 할 수 있습니다 (예 : class X {int foo() {return 1; }};'. 이것은 좋지 않습니다.'class X {int foo(); }; int X :: foo() {return 1; }'. –

답변

9

다음과 같은 경우 :

X.h

#ifndef X_H__ 
#define X_H__ 

class X 
{ 
public: 
    int foo() { return 1; } 
}; 

#endif 

Y.h을

#ifndef Y_H__ 
#define Y_H__ 

#include "X.h" 

class Y 
{ 
public: 
    Y(X *pX) { myval = pX->foo(); } 
    int myval; 
}; 

#endif 

something.cpp

#include "X.h" 

... 

something_else.cpp 것은

#include "Y.h" 

... 

그럼 아무 문제가 없어야합니다.

그러나, X.h 대신 다음과 같다 경우 : 당신이 something.cppsomething_else.cpp를 연결하려고 할 때

#ifndef X_H__ 
#define X_H__ 

class X 
{ 
public: 
    int foo(); 
}; 

int X::foo() { return 1; } 

#endif 

다음 당신은 참으로 링커 오류가 발생합니다. X::foo은 비 인라인으로 두 개의 개별 번역 단위으로 정의됩니다.

+1

그리고 해결 방법은 ...? Noone은 클래스 내에서 메소드를 정의하려고합니다. –

+0

@ TomášZato : 해결 방법은 무엇입니까? 두 가지 옵션이 있습니다. 클래스 정의에서 "inline"멤버 함수를 정의하거나 별도의 .cpp 파일에 정의합니다. –

+0

이것은 방금 많은 시간을 절약 해주었습니다. 그러나 나는 아직도 이것이 왜 그런지 알지 못합니다. 내 코드에는 X.5라는 파일이 클래스없이 있고 단지 두 개의 도우미 메소드 만있다. 이제 저는 그것들을 클래스 안에 넣어 정적으로 만들었고 작동합니다. 아무도 그것을 설명 할 수 있습니까? –

1

Y 헤더에 선언을 사용할 수 있습니다.

class X; 

X에 대한 포인터 만 사용하므로 컴파일러는 정의를 알 필요가 없습니다.

+0

여기는 문제가 아닙니다. –

관련 문제