2016-10-16 2 views
-1

할당 연산자의 개념을 둘러 보거나 적어도 성공적으로 작성하는 데 문제가 있습니다.C++의 이중 링크 목록 할당 연산자

복사 생성자는 저에게 중요한 문제는 아닙니다.

//copy constructor 
Set::Set(const Set &rhs){ 
    _head = rhs._head; 
    _tail = rhs._tail; 

    //null, basically this object is 0 
    if(rhs._head == NULL){ 
     _head = NULL; 
     _tail = NULL; 
     _size = 0; 
    }else{ 
     _head = new Elem(*rhs._head); 
     _tail = new Elem(*rhs._tail); 
     _size = rhs._size; 

     Elem *prev = NULL; 
     Elem *curr = _head; 
     Elem *otherCurr = rhs._head; 
     int counter = 0; 
     while(otherCurr->next != NULL){ 
      curr->next = new Elem(*otherCurr->next); 
      curr->next->prev = curr; 


      curr = curr->next; 
      otherCurr = otherCurr->next; 
     } 

     //now that we are done lets setup the tail 
     _tail->prev = curr; 
     curr->next = _tail; 

    } 

} 

내가 예제 코드를 읽고, 일부 사람들이 그것을 구현하는 #include <algorithm> 라이브러리를 사용 보았다 : 여기에 광산이 작업이 있다는 것입니다. 나는 대신 그것을 시도했지만, 전혀 작동하지 않는 것 같습니다.

//assignment operator 
Set& Set::operator=(const Set &rhs){ 
    Set temp(rhs); 
     std::swap(temp._head,_head); 
     std::swap(temp._tail, _tail); 
     return *this; 

} 

위의 코드는 제대로 작동하지 않습니다. 할당 연산자가 어떻게 만들어 졌는지에 대한 개념을 파악하는 데 정말 어려움을 겪고 있습니다. 나는 당신이 하나에서 다른 것으로 값을 복사하기를 원하는 것처럼 기본적으로 똑같이 작동 할 것이라고 생각했습니다. 그러나 분명히 아닙니다. 누군가가 저에게 일하는 방법에 대해 조언 할 수 있다면 그것은 좋을 것입니다.

내 수업에 대한 좀 더 일반적인 정보는 목록의 시작과 끝을 가리키는 a _heada _tail입니다. 더미 요소. 여기

개체가 어떻게 구성되어 있는지입니다 :

내가 당신의 복사 생성자 두 가지 문제를 참조
struct Elem { 
     ELEMENT_TYPE info; 
     Elem *prev, *next; 
    }; 
    Elem *_head, *_tail; 
    int _size; 
+0

아니요 [mcve]에 대해 투표를 종료하고 닫습니다. 주제 : 복사 생성자에서 잠재적 인 상처의 전체 세계 :'_head = rhs._head; _tail = rhs._tail;'주제 끄기 : 밑줄 접두어로주의하십시오. 일반적으로 내부 라이브러리 사용을 위해 예약되어 있습니다. 여기서 안전해야하지만 글로벌 범위에서 그렇게하거나 대문자로 밑줄을 따라 가면 문제가 발생할 수 있습니다. – user4581301

+0

한숨, downvote 주셔서 감사합니다. 큰 도움 –

+0

'std :: list' 대신에 수동으로 링크드리스트를 구현하고 있습니까? –

답변

0

(심지어 더 발굴하려고 노력하지 않음) :

  1. 꼬리의 목적은 무엇인가? 필요하지 않거나 올바르게 사용되지 않습니다.
  2. 복사 루프가 otherCurr에서 멈추는 것 같습니다 .-> 다음은 NULL입니다. 그러나 마지막 요소의 curr-> next가 꼬리로 향하게합니다. 그리고 이것은 당신이 세트를 지나서 1 개 요소를 복사하거나 더 나쁜 것을 의미 할 가능성이 높습니다 (꼬리를 그 정의를 정확하게 보지 못할 수도 있기 때문에), 프로그램이 조만간 충돌을 일으킬 수있는 임의의 위치를 ​​복사하려고합니다.
+0

복사 생성자가 작동합니다. –

+2

아니요, 여기에 표시된 것처럼 아니요. 만약 당신이 운이 좋다면 아마 운이 좋을 것입니다. 클래스 불변량을 생각하지 않았으므로 다른 생성자에서 결과를 초기화하지 않습니다. – Tomek

+0

작동하지만 괜찮습니다. –