3주차 C++ 과제 3
3주차 C++ 과제 3
C++의 템플릿 클래스를 활용하여
실제 Vector 가 하는 일을 체험(?)해보는 과제이다
Generic 프로그래밍의 필요성,
메모리 관리의 중요성을 학습하기 위함!
구현 요구 사항
클래스 설명
클래스 구조
Inventory
- 각 요구 기능을 구현한 템플릿 클래스
ItemBase
- 아이템 용도의 클래스
- Name, Price를 멤버변수로 가짐
- 각 요소를 출력하는 Print 함수 존재
추가 파일들
pcp.h , cpp
- 미리 컴파일 된 헤더 기능 테스트 용
트러블 슈팅 1 - 미리 컴파일된 헤더
미리 컴파일된 헤더를 사용하던 중
갑자기 이러한 에러가 발생하였다
하지만 Main에는 딱히 문제가 없어보이는 상황이다
그런데 왜 C1854 에러가 뜨는지 다시 확인해보니…
pch.cpp를 만들어 놓았지만
정작 ‘미리 컴파일된 헤더’ 만들기는 아무도 하지 않고 있었다…
(생산자가 아니라 소비자가 된…)
.cpp의 해당 옵션을 ‘만들기’로 바꾸어 주니
문제가 해결되었다!
트러블 슈팅 2 - T 배열 생성 문제
Inventory의 복사 생성자를 구현하던 중
갑자기 위와 같은 컴파일 에러가 발생하였다
보아하니 딱히 이상해보이지는 않았기에
‘아 그러고보니 템플릿 함수는 컴파일러가 종종 잘 먹지 않지’라고 생각했었다
(실제로 디버깅 중 size_ 변수가 아니라 size를 자동완성해서
컴파일 에러를 몇번이고 잡아서 전과가 있는 컴파일러…)
그런데도 계속해서 같은 에러를 내뱉으니
뭔가 이상하다 싶어
ItemBase의 생성자를 보았는데
정말 ‘기본 생성자’가 없었다…
그렇기에 기본 생성자를 생성해주었더니
문제가 해결되었다!
- 템플릿 클래스는 컴파일러가 종종 코드 에러를 잘 표시해주지 않기도 한다
-
요새는 배열 대신 Vector를 쓰다 보니
저런 식으로 ‘배열’로 new를 선언할 때의
생성자를 미처 생각지 못하였다 - new[] 방식을 사용하려면 해당 클래스의 ‘기본 생성자’가
필요한 점을 숙지해 두자
(vector에선 vectorv(Capacity,ItemBase("",10))
이런 방식으로 가능하다)
Tip : 자꾸 파일들이 ‘한국어’로 인코딩 되어 Git에서 볼때 글짜가 깨진다….?
Git과 소스코드 파일을 종종 쓰다보면 알겠지만
‘주석’으로 단 한국어가 ‘Git’으로 보면 ‘깨져있는 경우’를
종종 발견한다
물론 나중에 따로 받았을땐 안깨져있지만
이 문제를 해결 못하나? 싶어
찾아본 해결책을 소개한다
(일단 요점은 ‘인코딩’인점을 기억하자)
- Visual Studio 상단 메뉴 -> 도구 -> 옵션
- 환경 -> 문서
- 우측에서 “특정 인코딩을 사용하여 파일 저장” 을 확인
- ‘유니코드(서명 있는 UTF-8) - 코드 페이지 65001 로 변경
이전에 한국어 인코딩으로 주석을 쓴 경우
커밋을 다시해야 하지만
Git Desktop으로 볼 때, 깔끔하게 올라가게 된다
후기
사실 템플릿 클래스는 다뤄본지 꽤 오래되었기에
다소 당황한 면이 있는 과제였다
(공통 컨테이너, Utility 클래스 등이라면 고려 가능하나
일반적인 게임 컨텐츠 구현에서 만지기 쉽진 않다)
특히 오랜만에 만져보니
‘아 템플릿 쓰면 헤더에만 구현했어야 했지’
‘템플릿은 사실 컴파일 시간에 모든 타입 구현하여 헤더에 복사하는 거였지…‘
‘템플릿 쓰면 인텔리센스가 이상해지는건 여전하구나’
등을 느낄 수 있었다…
좋은건가…??
어찌되었든
좋은 복습이 된 과제였다
댓글남기기