[C++] hpp 파일 does not name a type

2017. 7. 10. 22:23공부 자료

[C++] hpp 파일 does not name a type, hpp 파일에서 선언한 Class 를 찾을 수 없을 때


    전 포스트인 Undefined Error 에서도 말했듯, 필자는 CPP을 열심히 공부중이다. 간단한 에러에도 마음이 아픈 초보이다 ㅎㅎ... 이번에는 hpp 파일에서 class 를 선언 했는데 hpp not declared 되어있다고 나오는 오류에 대해서 알아보도록 하겠다.


    열심히 오목을 구현하려고 hpp에 class를 만들고 cpp에서 이를 구현하려고 하는 순간 다음과 같은 에러가 뿜어져 나왔다.

[ 사진 1 : 에러 코드 ]


혹시 hpp 파일 안에 선언되어 있는거 아닌가? 왜 찾을 수 없다는 것이지... 같은 의문을 위해서 고쳐지기 전 코드를 첨부한다.


보면 알 수 있듯, 같은 hpp 파일 안에 Location class 가 존재하지만, 이를 인식하지 못하고 does not name a type 이라고 하는 것을 볼 수 있다. 답답하다. Java 나 python, C 같은 언어에서는 이러한 문제가 없었는데...


결과적으로 hpp 파일을 컴파일 할 때에는 코드를 위에서 부터 하나씩 읽어서 컴파일하는 것이 문제였다. C 언어에서 Prototype 을 사용하는 이유도 이와 같다. 


Java, Python 등의 언어에서는 컴파일 과정을 거치지 않거나 컴파일하면서 동적으로 연결 하여 구현하는 방식으로 Programming 언어가 구현되어 있지만, 어째서인지 C++에서 이를 하지 않았다는 것이 의문이 들었다


아마 최적화를 컴퓨터가 하는 것이 아닌 개발자에게 맡기기 위함이 아닐까... 중요한 것이 아니니 지나가도록 하겠다. 아시는 분은 댓글로 ㅎㅎ..


이렇게 선언과 구현의 분리는 분업 환경에서 좋으며, 소프트웨어 공학적인 측면에서도 프로그램 디자인단에서와 프로그램 구현 단계를 프로그래밍 언어단에서 구분 할 수 있다는 장점이 있다. ( 그래도 C 언어의 생산성보다는 다른 언어가 더 좋을 것 같다 ㅋㅋ )


잡소리가 길었지만, 즉, Location Class 의 위치가 문제였다. 사용하기 위해서는 C 언어에서 구조체를 코드의 제일 앞에 선언하고, 함수 prototype과 typedef를 사용하듯, 먼저 선언 해 주어야 한다.


즉, 다음과 같이 사용하는 것이다.

class Location;

...

class Location{

...

};


혹은 단순히 Location을 맨 위로 올려서 구현 해 주어도 된다. 이 떄 Prototype으로 상속을 선언 ( class Location:Point ) 같은 것은 불가능하다.


필자는 class prototyping 을 모르고 있었기에 단순히 맨 위로 올려서 구현 해 주었지만, class prototyping이 header file의 존재 의의에 부합하는 더 좋은 방식이라고 생각된다.




참고자료

참고자료1

- 참고자료2