[C++] template class 구현 시 header와 source를 관리하기
글쓴이: HDNua / 작성시간: 일, 2015/11/29 - 12:02오후
C++의 template은 어렵네요. 질문 하나 하겠습니다.
학교에서는 C++의 클래스를 설계할 때
header 파일과 source를 나누는 것이 좋다고 가르치고 있고,
저도 그것에 동의합니다.
header 파일에는 선언만 있고, source 파일에는 정의가 있는 것이
header만 보고 클래스를 파악하기 용이하기 때문입니다.
source가 숨겨져서 object 파일과 header만 건네도 되는 것도 그렇구요.
그런데 template은 기본적으로 컴파일러가 찍어내는 것이고
template을 생성하려면 컴파일러가 코드를 모두 알고 있어야 하기 때문에,
사용하려면 구현 또한 header에 작성하거나 source 파일 자체를 포함해야 하는 것으로 알고 있습니다.
그래서 저는, 이것이 header와 source를 분리하는 것이 좋다는 원칙에 위배된다고 생각해서 이 문제를 해결하고 싶어요.
질문입니다.
1. 이런 상황을 header와 source로 분리할 수 있을까요? 분리하는 것이 좋을까요, 아니면 알던 대로 header에 작성하거나 source를 포함하는 것이 맞을까요?
2. C++ template 가이드라는 책이 있는 모양이던데 학부생이 읽을 수 있을까요? 공부는 열심히 했습니다.
3. C++ 능력을 키울 수 있는 다른 책도 추천해주실 수 있는지 궁금합니다.
읽어주셔서 감사합니다.
-----
질문 추가.
이런 코드를 분리할 수 있는 방법이 있을까요?
template <class Key, class Value> class Dictionary { class Word { Key _key; Value _value; public: Word(); Word(const Key& key, const Value& value); Key &key() const; void setKey(const Key& k); Value &value() const; void setValue(const Value& v); }; std::vector<Word> _words; public: Dictionary(); void insert(const Key& key, const Value& value) { _words.push_back(Word(key, value)); } };
Forums:
DB 쓰는거 같네요.
...
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
답변 감사합니다.
그런데 사실... 지금 떠오르는 DB는 Database밖에 없는데, 제 질문에서 어떻게 쓰이는지 잘 이해가 안 됩니다.
좀만 더 설명해주실 수 있나요?
저는 이렇게 생각했습니다.
말씀하시는 내용은 구조로 보입니다.
------------------------------------
구조는 구조체
구조체는 메모리 혹은 파일
메모리와 파일에 구조를 정리해 놓은것이 DB
------------------------------------
그 기능을 처리하는것이 함수와 쿼리
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
이 글과 동떨어진 글을 달아서 우선 질문자에게
이 글과 동떨어진 글을 달아서 우선 질문자에게 죄송합니다.
Shint님, 제 질문에도 저번에 답변하셨는데, 제가 작성한 본문과는 전혀 관련없는 내용만
복사 + 붙여넣기만 하시더군요...
분명 저도 알고있는 내용이었고 본문에 언급하였으며 문제의 원인은 알고있으나(추정)
해결책을 몰라 질문하는 글이었는데 전혀 엉뚱한 답변을 다시더군요.
매번 느끼는 거지만 질문자의 질문을 제대로 읽는지 궁금합니다.
C++ template 책에 분리하는 방법이 나와
C++ template 책에 분리하는 방법이 나와 있습니다만,
조금 복잡하고, 오히려 코드를 관리하기 어렵게 할 수 있습니다.
많은 라이브러리들도 헤더 파일에 포함시키는 경우가 많으므로, 템플릿 라이브러리는 그냥 헤더로 통합하는 것이 좋다고 생각합니다.
C++ template 책 학부생이 충분히 소화할 수 있고, 아울러 C++ template metaprogramming 과 Modern C++ Design 강추.
답변 감사합니다.
통합해서 쓰는 것이 좋다니 뭔가 아쉽네요.
답변 감사드립니다. 추천해주신 책도 방학때 열심히 읽어봐야겠어요.
저는 이렇게 생각했습니다.
위의 세 책은 C++9x 기반으로 쓰인 것이라,
위의 세 책은 C++9x 기반으로 쓰인 것이라, C++1x 를 먼저 익힌 후, 새로운 관점에서 학습하는게 좋을 것이라고 생각됩니다.
템플릿이라는게 기본적으로 오브젝트 파일에 인라이닝으로
템플릿이라는게 기본적으로 오브젝트 파일에 인라이닝으로 끼워 넣는 것으로
이해해야 한다고 생각합니다.
그런데, 만약 템플릿의 구현과 선언부분이 분리되어있다면 이런 문제가 발생합니다.
1. 컴파일러가 오브젝트 파일을 생성 시, 템플릿 인스턴스를 제외한 부분은 생성가능 하나
템플릿의 인스턴스를 생성할 수 없어 오브젝트 파일에 템플릿의 인스턴스를 인라이닝하는것은 불가능 합니다.(즉, 애초에 템플릿이 아니라는 겁니다.)
2. 만약 동일한 조건에서 컴파일러가 헤더파일만 가지고 템플릿을 인라이닝하려면
컴파일러는 템플릿의 인스턴스를 만들기 위해 템플릿 구현부가 필요 할 겁니다.
하지만 인클루드는 템플릿의 헤더파일만 하죠. 이게 문제가 됩니다. 컴파일러가 "알아서"
템플릿 구현부의 파일을 검색해야 한다는 거죠. 여기서 또 말이 안됩니다.
만약 알아서 검색하려면 템플릿 구현부의 파일이름에 관한 작명 규칙을 표준으로 지정해야 할 겁니다.
그리고 질문자가 생각하는 템플릿의 분리는 이미 표준에서
C++ template export 기능으로 제공하고 있습니다. 다만 현실적으로 위와 같은
이유로 매우 구현하기 힘들어서 실제 구현체를 제공하는 컴파일러는
거의 없는 것으로 알고 있습니다.(gcc, Clang and Visual Studio -> X)
관련 내용 링크 답니다.
- http://stackoverflow.com/questions/5416872/using-export-keyword-with-templates
- http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1426.pdf
(두번째 링크는 아예 논문 수준이군요. 이건 도저히 읽지는 못했습니다.)
헤더와 구현부의 완전한 분리는 아니지만, 제
헤더와 구현부의 완전한 분리는 아니지만, 제 기억에
VS에서의 STL 구현은 pimple 패턴을 사용하는 것으로 알고 있습니다.
void* 이용해서 실제 코드의 부풀림도 줄이고
implementation 부분은 미리 컴파일 가능하니 컴파일 시간도 획기적으로 줄어드니까요.
(데이터타입과 무관한 정보들은 오브젝트 파일 생성 가능 혹은 컴파일 가능. 나머지 부분만 템플릿 인스턴스화)
그리고 헤더에 해당하는 pointer 부분의 구현의 길이는 마찬가지로 획기적으로 줄어들겠죠.
답변 감사합니다.
주신 링크 잘 읽겠습니다. 소중한 답변 감사합니다.
저는 이렇게 생각했습니다.
댓글 달기