PGR21.com
- PGR21 관련된 질문 및 건의는 [건의 게시판]을 이용바랍니다.
- (2013년 3월 이전) 오래된 질문글은 [이전 질문 게시판]에 있습니다.
통합 규정을 준수해 주십시오. (2015.12.25.)
Date 2016/06/05 00:16:09
Name Kaestro
Subject [질문] [프로그래밍]c++ 템플릿 변환 관련해서
오늘 8시에 눈 뜨고 부터 지금 하루 종일 작성하고 있는 코드가 있는데 도저히 실마리를 못잡겠어서 혹시나 실마리를 잡을 수 있을까 하여 질문드려봅니다. 현재 작성중인 코드는 Node를 이용해서 List, SortedList, Set 이렇게 세 가지의 일종의 data를 저장하는 클래스들을 관리하기 위한 Container를 작성하고 그 Container들의 기초적인 기능들을 구현한 뒤, 이들이 template 포맷으로 작동하게 변환하는 코드입니다.

쉽게 말해 List는 [ a, b, e, d, d, a ] , SortedList는 [ a, a, b, d, d, e ], Set는 [ a, b, d, e ] 이렇게 작성이 되어야 하며 이들을 받기 위한 pure virtual class Container를 구현하는 것인데 제가 어제 오늘 해서 완성한 부분은 여기까지고, 지금 난관을 겪고 있는 부분은 이겁니다.
class Container;

class Node {
        friend class Container;
        friend class List;

        friend ostream& operator <<(ostream &out, const Container &container);
        friend ostream& operator <<(ostream &out, Node &node) {
                out << node.c;
                return out;
        }

public:
        static int nNode();

private:
        Node(char c);
        Node(const Node& node);
        ~Node();

        Node *next;
        char c;

        static int n;
};

위에 작성된 코드가 바로 처음 제가 저 녀석들이 돌아가도록 char variable만을 가지는 Node입니다. 이걸 이제 template을 이용해서 작성해야 되는 건데 제가 가진 문법적인 지식을 가지고는 도저히 답을 못 찾겠습니다. 아까부터 문법책도 계속 읽어보고, 구글링도 계속 해보고 있는데 보통 friend function 하나, friend class 하나, template 하나 이렇게 구현되는 사례들을 제시하는데 이걸 다 짬뽕시켜 놓으니까 대체 뭘 어떻게 어떻게 하라는건지 모르겠네요. 작성해 보고 있는 건

#ifndef NODE_H
#define NODE_H
#include <iostream>
using std::ostream;

template <typename T>
class Container;

template <typename T>
class List;

template<typename T>
ostream& operator<< (ostream&, const Container<T>&);

template<typename T>
ostream& operator<< (ostream&, Node<T>&);

template<typename T>
class Node {
        friend class Container<T>;
        friend class List<T>;

        friend ostream& operator << <>(ostream &out, const Container<T> &container);

        friend ostream& operator << <>(ostream &out, Node<T> &node) ;

public:
        static int nNode();

private:
        Node(T c);
        Node(const Node& node);
        ~Node();

        Node *next;
        T c;

        static int n;
};

template<typename T>
std::ostream& operator<< <>(std::ostream& out, Node<T>& node) {
        out << node->c;
        return out;
}

이게 일단 현재 최신 수정본이네요. node를 변수로 받는 ostream이 out << node.c; 부분이 먹통인것만 해결되면 나머지는 다 해결인 것 같은데 여기서 이유를 모르고 꼼짝없이 붙들려버렸으니...끙

통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
16/06/05 03:11
수정 아이콘
우선 template<typename T=""> 에서 =""는 들어갈 필요 없구요. node.c의 타입이 어떻게 되는건지 모르겠지만 아래 Node에는 변수 c가 없네요.
16/06/05 05:29
수정 아이콘
너무 길어지니까 이게 아랫부분이 짤리나보네요. 너무 오래 코드를 봤더니 정신이 나간 모양입니다. 저것도 눈치를 못채고. 말씀하신부분은 너무 길어서 가독성이 별로지 않나 싶어서 자르고 올렸는데 다시 넣어놨습니다.
16/06/05 06:27
수정 아이콘
지금 안 되는 이유는 friend function이 Node의 멤버가 아니라 external function인데 그 definition이 Node class 안에 있어서일 겁니다. 그런데 그거 말고도 고치셔야 할 점이 여기저기 있네요.
16/06/05 06:50
수정 아이콘
external function인데 definition이 Node class안에 있어서라고 하시는건

//////header/////

template<typename T>
ostream& operator<<(ostream&, Node<T>&);

template<typename T>
class Node {
/*중략*/
friend ostream& operator<< <>(ostream&, const Node&);
};

/////cpp////

template<typename T>
std::ostream& operator<< <>(std::ostream& out, const Node<T>& node) {
out << node->c;
return out;
}

이런 식으로 짜보라는 말씀이시려나요? 해봤는데 결과가 똑같아서 포기했던 방법인데 external function이라는게 member function이 아니라는 얘기인지는 알겠는데 그렇다고 이게 char기반일때는 안에서 되고 template 기반일때는 안에서 안되는 이유도 잘 이해가 안되네요. 보통 이렇게 글로 쓰다보면 아 맞다 하고 고치러 가는데 이게 대체 몇시간짼지
16/06/05 13:03
수정 아이콘
몇 시간째 하고 계신다고 그러셨는데.. 자동차 사서 뭐가 안 돌아간다고 매뉴얼도 제대로 안 읽고 이거 저거 막 누르면 잘 안 고쳐지겠죠. 연습은 설명을 이해하기 위해서 하는 거고 책을 읽는 게 처음엔 지루해도 시간 낭비를 많이 줄일 수 있다고 생각합니다.

굳이 돌아가게 하려면 cpp에 있는 거 header Node template class 앞으로 옮기시고, 그 앞에
template<typename T>
class Node;
와 같이 forward declaration을 넣으시면 됩니다.
16/06/05 13:28
수정 아이콘
이게... 제가 지금 혹시 아무 내용도 안 읽고 했다고 생각하는거면 그런건 아닌게 책에 있는 내용정도는 전부 구현해 봤고, 책도 지금 세번씩 읽어 본 거고, 수업시간에 했던 실습과제도 다 제출해서 냈고, 구글에서 뒤져본 기반으로 있는 내용도 구현해봤고, 말씀해보신 것하고 아래 있는 것도 다 구현해봤거든요. 메뉴얼도 안 읽어보고 이것저것 막 눌러보는 수준은 저도 아닙니다.

지금 하다보니까 저기보단 다른데도 문제가 많아서 안 돌아가는게 맞는 모양이라 다시 짜보려고 합니다.

메뉴얼도 안읽어봤다는 비유를 들으니까 뭔가 좀 울컥하네요. 제가 그정도도 확인하지 않고서 질문하고 다닐정도로 양심없는 녀석은 아닙니다...

그리고 혹시 제가 수정해놨다는 것 가지고서 저거 자체가 틀렸다고 생각하시는 거면, 저것도 찾아보면 더 효율이 좋은 코드라고 해서 더 simple한 환경으로 돌려봤거든요.
16/06/05 13:45
수정 아이콘
그것만 보고 하는 얘기는 아닙니다. 드러난 설계 전체를 보고 드린 말씀이에요. 그리고 질문하신 분을 무시하려던 의도도 없습니다. 일반적으로 성실한 대부분의 학생들이 그런 접근을 취한다고 느껴 왔고, 일반적인 조언을 드리려던 것이었습니다.
16/06/05 14:09
수정 아이콘
그럴 의도로 말씀하신게 아니란건 알았는데도 제가 감정적인 상태를 못이겨서 말을 심하게 한 것 같네요. 죄송합니다.
그리고 주신 답변도 답중 하나는 맞는 것 같은데 제가 가진 문제가 너무 심각했었고 질문을 못할 정도로 가닥을 못잡은 것 같습니다. 계속해서 답변해주셔서 감사합니다.
16/06/05 11:06
수정 아이콘
http://coliru.stacked-crooked.com/a/fe7190c3870e2a87

달라진 부분 확인해보시면 어디가 문제였던건지 아시게 될겁니다.
16/06/05 11:56
수정 아이콘
좋은 답변 감사드립니다. 방금 시도해봤는데 Derived Class의 default constructor만 불러도 '확인할 수 없는 외부 참조입니다.'라는 에러 메시지가 나오는 걸 봐선 제가 생각한 저 부분 외에도 심각한 문제가 있었던 모양이라 아마 저부분 말고도 코드를 아예 베이스부터 다시 깔아만들어야 될 모양입니다.
이번 학기 이 수업 공부는 하면 할수록 우울해지네요. 공부는 자신 있다고 생각했는데 뭐가 좀 늘어서 잘 된다 싶으면 계속 손을 못대는 문제들이 나와서 밤만 새고 있으면 내가 이렇게 못난 놈이었나 하는 자괴감만 계속 느는 것 같습니다...
그래도 한발짝 나아진 것 같으니 마저 노력해보겠습니다. 정말 감사합니다.
16/06/05 12:36
수정 아이콘
이건 C++ 잘못이니 너무 낙담하지 않으셔도 됩니다. 매일 C++ 쓰는 사람들도 컴파일 에러 하나 고치려고 2~30분씩 삽질하는게 태반입니다 ㅜㅜ
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
86505 [질문] how can i do? [25] tannenbaum6409 16/07/14 6409
86504 [질문] 통화 녹음어플 사용하시는 분들 질문입니다. [1] 아는남자3146 16/07/14 3146
86503 [질문] 컴퓨터 소리 분할?(게임이 하고싶어요..) [8] 너랑나랑8633 16/07/14 8633
86502 [질문] [LOL] 시비르 상대로 어떤원딜 많이 하시나요? [13] 블루토마토3427 16/07/14 3427
86501 [질문] 1박 2일 국내 여행지 추천 부탁드립니다. [6] 꿀벌3331 16/07/14 3331
86500 [질문] 염색관련해서 질문 드립니다 [3] 맨송맨송2575 16/07/14 2575
86499 [질문] 국제항공(에어차이나) 여권번호 수정 가부 [4] lou6568 16/07/14 6568
86498 [질문] 유료 안티바이러스 프로그램 추천을 부탁드립니다. [4] Miyun_862928 16/07/14 2928
86497 [질문] 트랙스에 맞는 타이어 인치! [7] Dawn6225 16/07/14 6225
86496 [질문] 특정 계정으로 메일을 보낼 경우 관계없는 계정으로도 메일이 날아가는 현상 [4] 소로리2716 16/07/14 2716
86495 [질문] 어울리는 안경 고르는 방법?? [3] 랄라스윗3451 16/07/14 3451
86494 [질문] 모바일 백신 중에 쓸만한거 있을까요? [2] 구경꾼2753 16/07/14 2753
86493 [질문] 노래 찾습니다! 도와주세요~ [2] 주여름2451 16/07/14 2451
86492 [질문] [포켓몬GO] 기존 포켓몬 게임과 많이 틀리나요? [1] 하이킹베어3552 16/07/14 3552
86491 [질문] 갤럭시 노트7에 홍채 인식 기술이 포함된다고 하는데요. [4] 아케르나르2928 16/07/14 2928
86490 [질문] 원터치텐트 추천할 만한 것이 있으실까요? [2] LG.33.박용택4775 16/07/14 4775
86489 [질문] 삼국지 13 유저패치가 꽤 나온 것으로 아는데 평이 어떤가요? [6] Igor.G.Ne6972 16/07/14 6972
86488 [질문] 노트북 보통 얼마나 오래 사용하시나요? [35] im98n5696 16/07/14 5696
86487 [질문] 방탈출게임 해보신분들 계신가요? [9] 순수한사랑4345 16/07/14 4345
86486 [질문] 라디오스타 (신정환,김구라, 윤종신) 시절 편 구할수없나요? [2] 솔마7109 16/07/14 7109
86485 [질문] 전연령 렌트카에 관하여 질문 드립니다. [7] 로랜8901 16/07/14 8901
86484 [질문] 에어아시아 예매관련 질문 [6] siam shade2954 16/07/14 2954
86483 [질문] [스타2] 복귀유저가 질문합니다! [2] 검정치마2748 16/07/14 2748
목록 이전 다음
댓글

+ : 최근 1시간내에 달린 댓글
+ : 최근 2시간내에 달린 댓글
맨 위로