2011-04-29 6 views
1

오류를 피할 수있는 방법을 알려주세요. 미리 감사드립니다.오류 : 생성자의 다중 정의

파일 이름 : point.hh

#ifndef POINT_H 
#define POINT_H 
class Point{ 
    private: 
     int x; 
     int y; 
    public: 
     Point(); 
}; 
#endif 

파일 이름 : point.cc

#include "point.hh" 
#include <iostream> 
using namespace std; 
Point::Point() 
{ 
    x=0; 
    y=0; 
    cout<<"x="<<x; 
    cout<<"y="<<y; 
} 

파일 이름 : main.cc

#include"point.cc" 
int main() 
{ 
    Point p;    // calls our default constructor 
} 

답변

15

당신은 헤더 파일을 포함해야합니다 소스 파일이 아닌 main.cc 파일에 Point 클래스를 사용하십시오.

입니다

대체 :

#include"point.cc" 

작성자 :

#include"point.hh" 

이 뒤에 근거는 inline를 표시하지 않는 한 함수 정의,의 ODR ("한 정의 규칙을 존중해야한다는 것입니다 "). 다른 소스 파일에 소스 파일을 포함 시키면 두 가지 다른 번역 단위로 Point::Point() 함수의 두 가지 (동일한) 정의가 생깁니다.

연결 프로세스가 발생하면이 두 정의를보고 불평합니다. 즉, 오류가 발생했습니다.

+0

어떻게하면 컴파일러의 관점에서 볼 수 있습니까? 나는 당신이 g ++ main.cc point.cc와 cpp main.cc 그리고 cpp point.cc로 컴파일하려고 함을 의미한다. #includes에 대한 정의가 모두 포함되어 있는데, 이것이 근본적인 이유이다, 맞습니까? –

+0

완벽! 고마워 .. – abc

+0

@Umut Tabak : 네가 제대로 할 수 있을지 모르겠다. 그렇다. 그게 이유 야. 그러나 OP가'point.cc '에 대해 생성 된 객체 파일을 추가하지 않으면 링크 프로세스는 성공할 것입니다.이 경우'Point :: Point()'에 대한 하나의 정의 만 있기 때문입니다. 이것은 여전히 ​​정말로 진절머리 나는 점에 유의하십시오. – ereOn

2

또 다른 원인은 빌드 명령입니다. 동일한 .cpp 파일을 두 번 나열하면 분명히이 오류가 발생하며 작성하지 않은 함수에도 오류가 있다고 말할 수 있습니다.

향후 누군가를 도울 수 있습니다.