c++ 왕초보 const 질문 드립니다. ㅠ

조회수 791회
//노드 구조체
template <typename T>
struct Node {
    T idata;
    Node<T>* ptr_next;
    Node<T>* ptr_prev;

    // 값이 들어오지 않았을때의 초기화,
    Node() :

        idata(0),
        ptr_next(nullptr),
        ptr_prev(nullptr) {}

    // 값이 들어왔을때의 초기화 
    Node(const T& _idata, const Node<T>* next, const Node<T>* prev) //  @@질문 부분@@
        : idata(_idata)
        , ptr_next(next)
        , ptr_prev(prev) {}

};                                  

Linked list 를 클래스 템플릿 형태로 만들고 있습니다. 노드 부분을 구조체로 만들고 있는데 ,,

위 코드와 같이 노드의 생성자 부분의 인수 2번째와 3번째에

const 를 넣으면 오류가 생기는데 이유가 무엇인가요?

1번째에 const 를 넣을때는 아무 문제도 없었는데 말이죠..

전체 코드를 올리면 너무 길어져서.. 안 읽으실까봐 노드 부분만 올렸습니다

2 답변

  • 좋아요

    2

    싫어요
    채택 취소하기

    인수 앞에 const를 불이게되면, 그 인수는 상수이다. 즉, 이 함수 내부에서는 절대 그 값을 변경하지 않을 것이다라는 것을 명시하는 것입니다.

    지금 질문에 올린 코드만으로는 아무 문제가 없는 코드입니다.

    아마도 질문에 길어서 올리지 않았다고 하는 코드에서 nextprev에 값을 대입하는 코드가 있어서 발생하는 에러입니다.

    const를 붙인 변수는 읽기만 가능합니다. 만약 const를 붙인 변수에 변경을 가하는 코드가 있다면 컴파일러는 그것을 에러로 표시합니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 혹시 몰라 노드 생성자를 이용하는 push_back 함수를 올립니다. koladuckhu 2022.1.28 23:29
    • 코드를 아래에 올렸습니다. 혹시 Node* ptr_Node = new Node(idata, nullptr, nullptr); 부분에서 값을 대입한다고 보면 되는 건가요?? koladuckhu 2022.1.28 23:45
    • 아.. 정말 부끄럽네요 ptr_next 와 ptr_prev 를 Node T* 로 선언해 놓고 그거를 const Node T* 로 받으려고 하다니.. 제가 제대로 못봤네요.. 답변해 주셔서 정말 감사합니다!! Node* b; const Node* a = nullptr; b = a ; 혹시나 비슷하게 해 보았는데 오류가 나네요 koladuckhu 2022.1.29 00:17
    • C에서는 일반 포인터 변수에 const 포인터 변수의 값을 대입하는 것이 허용됩니다(경고만 표시). 그러나 C++에서는 그것을 오류로 지적합니다. const 포인터 변수가 원래 내용을 안바꿀려고 만든 변수인데, 값을 바꿀수 있는 일반 포인터 변수에 넣어 그곳의 값을 바꿀 여지를 만드는 것이 코드 작성자가 의도한 것인지, 아니면 실수인지를 모르기 때문에 보수적으로 오류로 판정하는 것입니다. 만약, 의도적으로 바꾸고 싶은 경우에는 const_cast라는 것을 이용해서 바꾸면 되고, const_cast를 사용한 경우 그 코드를 유지보수하는 사람은 `아 의도적으로 바꾼것이구나`라고 해석할수 있게 됩니다. 알 수 없는 사용자 2022.1.29 21:57
    • 아 의도적으로 바꿀때는 const_cast를 이용하는 군요.. 답변 감사합니다. koladuckhu 2022.1.29 23:36
  • template <typename T>
    void CList<T>::push_back(const T& idata) {
    
        Node<T>* ptr_Node = new Node<T>(idata, nullptr, nullptr);
    
        if (0 == this->icount )
        {
            this->ptr_head = ptr_Node;
            this->ptr_tail = ptr_Node;
         } else {
            ptr_Node->ptr_prev = this->ptr_tail;
            this->ptr_tail->ptr_next = ptr_Node;
            this->ptr_tail = ptr_Node;
         }
                ++this->icount;
    
    }
    

    이미지

    여기서 혹시 잘못된 부분이 있을까요??
    여러번 봐도 잘 모르겠습니다.. 에러 부분도 캡쳐해서 올리겠습니다.

    애매한 질문 답변해 주셔서 정말 감사드립니다

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)