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분씩 삽질하는게 태반입니다 ㅜㅜ
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
85931 [질문] 혹시 방금 부산,울산,경남지방 지진 이었나요.. [21] 키토3631 16/07/05 3631
85930 [질문] [ps4] 어쌔신 크리드 시리즈 질문입니다. [6] 삭제됨1723 16/07/05 1723
85929 [질문] 친척 동생이 지금 의예과에 있는데, 약을 먹어요. [13] 학자3937 16/07/05 3937
85928 [질문] 축구를 무슨 재미로 보는지 모르겠어요 [61] 삭제됨8618 16/07/05 8618
85927 [질문] 노트북에서 게임을 하는데 bgm이 안 나옵니다. 가고또가고2076 16/07/05 2076
85926 [질문] 영단기 신토익 이벤트로 교재받으신분들께 질문요! [8] BBC특전대2612 16/07/05 2612
85925 [질문] 앞으로 만날 여자들에게 사소한 실수 해서 호감 없어질까봐 걱정되네요 [15] 패르바티패틸4827 16/07/05 4827
85924 [질문] [lol] 듀오로하면 뭔가 다른게있나요? [3] 내사랑사랑아1963 16/07/05 1963
85923 [질문] 정답이 뭐죠? [14] 갓설현3609 16/07/05 3609
85922 [질문] 휴대폰 이어폰을 컴퓨터에 연결하는 분배기 오프라인에서 살수없나요? [4] 슈아재3427 16/07/05 3427
85921 [질문] [오버워치] 30점대 심해입니다... 진지한 고민이 있습니다.. [31] Secundo4629 16/07/05 4629
85920 [질문] 미니휠이나 조위기어 미코와 비슷한 크기의 마우스 있을까요? [4] 꼭두서니색4725 16/07/05 4725
85919 [질문] 파판 13-2은 언제부터 재미있어지나요? [6] 예루리2648 16/07/05 2648
85918 [질문] [오버워치] BJ 유투브 영상 추천 부탁드려요. [4] Special One3050 16/07/05 3050
85917 [질문] 여자 목걸이 브랜드 질문드립니다. [2] 용조5368 16/07/05 5368
85916 [질문] PHP 통해서 AWS MYSQL DB 인스턴스 내부값을 가져오려 하는데 결과값이 출력되지 않습니다. [9] 레이오네2245 16/07/05 2245
85914 [질문] 휴가지 추천 부탁 드립니다. [4] 은빛사막2228 16/07/05 2228
85913 [질문] 해커스토익학원 스터디 좋은가요? [9] Genius6185 16/07/05 6185
85912 [질문] 오사카 여행 문의 드립니다 [5] 세카이노오와리2001 16/07/05 2001
85910 [질문] 알고리즘 독학 책 추천 부탁드립니다. [15] 좋은하루되세요21088 16/07/05 21088
85909 [질문] 스팀 세일을 자주하나요? [4] 아리아리해2200 16/07/05 2200
85908 [질문] IT 소식을 빨리 알 수 있는 해외 사이트 없을까요? [2] 박용택3437 16/07/05 3437
85907 [질문] 수염 제모에 관해 질문이 있습니다. [10] SanBon7387 16/07/05 7387
목록 이전 다음
댓글

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