2011-03-24 4 views
1

나는 간단한 클래스를 정의했다. 정의는 헤더 파일에 있고 implmentation는 CPP 파일에 있습니다 :헤더 파일. 등

HEADER :

#ifndef POINT_H 
#define POINT_H 

class Point { 
public: 
    Point(int x, int y); 

    int getX(); 
    int getY(); 

private: 
    int x, y; 
}; 

#endif 

CPP

#include Point.h 

Point::Point(int x=2, int y=2) { 
    this->x = x; 
    this->y = y; 
} 

int Point::getX() { 
    return x; 
} 

int Point::getY() { 
    return y; 
} 

이 컴파일되지 않고 나는 이유를 모르겠습니다. 또한, 다른 곳에서 점을 인스턴스화 할 때 main.cpp라고 말하면 맨 위에 #include, Point.h 만 있으면됩니까? 그렇다면 Point.cpp를 어떻게 알 수 있습니까?

+0

(주)에는 point.h가 포함되어 있습니다. point.cpp는 프로젝트에 추가하면 자동으로 포함되는 파일입니다. – ultifinitus

+0

인용 부호가 누락 된 것 같아요, #include "Point.h" –

+0

'point.cpp'는'main.cpp'와 같은 컴파일 단위입니다. 그것들을 컴파일 할 때, 같은 헤더 파일을 포함하고있는'point' 구조가 무엇인지를 모두 알고있는 객체를 생성합니다. 두 개체를 연결하면 실행 파일이 생성됩니다. 당신은'main.h'를 컴파일하기위한 구현을 할 필요가 없다. 구조의 선언이 필요하다. – Benoit

답변

1

당신은 따옴표가 누락되었습니다. 이것은 작동하지 않습니다. 클래스의 클라이언트가 헤더를보고 따라서 기본 매개 변수없이 Point를 호출 할 수 있다는 것을 모르는 경우 어떻게 작동하는지 조금 생각해보십시오.

트릭은 구현이 응용 프로그램에 컴파일되고 호출이 선언 (헤더의 내용)을 사용하여 해결된다는 것입니다. 각 호출에 대해 컴파일러는 심볼 이름을 만들고 호출을 표시합니다 (예 : Point :: getX를 호출하면 컴파일러에서 call [email protected]@과 같은 호출을 삽입 함). 컴파일러 다음에 오는 링커는이 함수를 검색합니다. 구현되면 호출자가 발견되어 Point::getX() 소스 코드로 "리다이렉트"됩니다.

[편집] 오, #include "Point.h"를 써야합니다.

8
#include Point.h 

Point.h 주위에 따옴표가 필요합니다.

Point::Point(int x=2, int y=2) 

기본 인수하지 .cpp 파일의 정의에 (그것을있는 그대로 컴파일하지만, 당신이 원하는 것을하지 않을 것이다), 헤더 파일의 선언에 있어야합니다.

문체에 따르면 로컬 변수 나 인수를 멤버 변수와 동일한 이름으로 지정하는 것은 일반적으로 바람직하지 않습니다. 이렇게하면 쉽게 혼동을 일으킬 수 있습니다. ,

Point::Point(int x_, int y_) : x(x_), y(y_) { } 
코드가 현재 기록되면

, xy가 모두 구성되어 당신은 그들에게 할당합니다 당신은 또한 초기화 목록을 사용하여 멤버 변수를 초기화 할 수 있습니다. 이니셜 라이저 목록을 사용하면 할당이 제거되고 직접 구성 할 수 있습니다. int과 같은 기본 유형에는 문제가되지 않지만 클래스 유형에는 중요합니다.

이것은 컴파일되지 않으며 이유가 확실하지 않습니다.

일반적으로 컴파일러에서 발행 한 오류 메시지가 유용합니다. 다른 도움이되지 않는다면, 도움이되지 않는 사람은 도와 주려는 사람들에게 도움이됩니다. 내가 다른 곳에서 포인트를 인스턴스화 할 때 또한

, 말 MAIN.CPP, 무엇을해야합니까 상단에 #include, 단지 Point.h를?

예.

Point.cpp를 어떻게 확인합니까?

작성한 각 .cpp 파일은 별도의 개체 파일로 컴파일됩니다. 모든 .cpp 파일이 오브젝트 파일로 컴파일되면 오브젝트 파일이 모두 excecutable (또는 라이브러리)에 링크됩니다. 링커는 모든 것이 정의 된 곳을 파악합니다.

+0

잘자요. 그것을 보지 못했 ... – ultifinitus

+0

이 상세한 응답을 보내 주셔서 감사합니다. – user620189

+0

@ user620189, 도움이되는 답변을 찾은 경우 답안 옆에있는 체크 표시 개요를 클릭하여 수락하십시오. –

1

헤더에 인수 기본값을 넣어야합니다.이 메시지가 사용자의 문제인지는 알 수 없습니다. 또한 귀하의 포함을 인용해야합니다 #include "Point.h"

0

무엇이 오류입니까?이 실행 파일을 빌드 할 때

#include "Point.h" 

링커는 코드에 대한 참조를 해결합니다

당신은 단지 .H 파일을 포함한다. 당신은 당신이 구현에서 x와 y에 대한 기본 값을 정의 Point.h

1

을 포함해야 Point를 인스턴스화하려는 당신이 파일에서

#include "Point.h" 

을 포함에