2011-10-30 3 views
4

컴파일 된 .o 파일을 받았지만 원본 .cc 파일이없고 프로그램의 헤더 파일이 절반 밖에되지 않았습니다. . 헤더 파일에는 모든 메소드 서명이 있지만 개인 변수 선언이 없습니다. 이 .o 파일을 프로젝트에서 사용할 수있게하려고하는데 .o 파일에 정의 된 클래스의 생성자에서 세그먼트 화 오류가 발생합니다. 프로그램이 컴파일됩니다. 어떻게 작동 시키나요? 이 프로그램은 숙제이며 교사는 .cc 파일을 보지 않기를 원합니다. 또한 선생님은이 문제에 대해 알고 있습니다. 나는 단지 그것을 스스로 알아 내려고 노력하고있다. (그리고 너희들의 도움으로).). 나는 전에 다른 선생님과 함께이 일을했다고 생각했지만 아무런 문제가 없었습니다. 프로그램을 컴파일하는 데 사용되는 makefile이 있습니다..cc 파일없이 .o 파일을 컴파일하는 C++

+0

프로젝트를 컴파일하는 방법과 오류는 무엇입니까? – ObscureRobot

+1

헤더에 비공개 클래스 멤버가 없거나 다른 것들만 있습니까? – Dani

+0

클래스에 정적 메서드가 있습니까? 헤더를 게시 할 수 있습니까? 나는 이것이 풀릴 수 있다고 생각한다. – Beta

답변

4

C++ 프로그램을 사용하고 있고 헤더 파일에 클래스 정의가 포함되어있는 경우 클래스 정의는 원래 파일을 빌드하는 데 사용 된 클래스 정의와 정확히 일치해야합니다 (). 이것은 One Definition Rule입니다. 교수가 클래스 정의에서 private 변수 선언을 제거하면 충돌이 발생할 가능성이 높습니다. 이는 서로 다른 .o 파일이 해당 클래스에서 정의한 객체의 크기에 대해 일치하지 않기 때문입니다.

교수님이 수업의 구현을 숨기려면 p/impl pattern을 사용해야합니다. 헤더 파일을 사용하려면 맹 글링 된 클래스 정의를 완전히 제거하고이를 사용하려고 시도하지 않아야합니다 (그러나 포인터 매개 변수로 클래스를 가져 오거나 리턴하는 모든 함수를 충족 시키려면 class Foo;에서와 같은 순방향 정의를 사용할 수 있습니다) .

+0

포인터를 사용하는 함수에 클래스를 전달할 수있는 것은 C++에서는 거의 가능하지 않습니다. (C 스타일 클래스를 사용하지 않는 한) – Dani

+0

@Dani입니다. 실제로 선언문을 작성하지 않으면 최선을 다할 수 있습니다. – bdonlan

+0

또 다른 방법이 있습니다 : 클래스를 분해하는 방법으로 클래스의 크기를 알아 내고, 그 크기로 채 웁니다. – Dani

관련 문제