2009-10-01 3 views
0

C++에서 단독 링크 목록 클래스를 작성하려고합니다. 나는 데이터 구조 클래스에서 몇 년 전에 그것을했지만, 세부 사항을 기억할 수 없다.링크 된 목록 및 복사 생성자

Node 클래스에 복사 생성자가 있어야합니까? 여기에는 Node *가 멤버 변수로 포함되어 있습니다. 동적 멤버가있는 클래스에 대해서는 항상 복사 생성자, 소멸자 및 대입 연산자를 작성해야합니다. 하지만 그물에서 본 것에서 List 클래스는 노드 복사를 처리합니다. 이것이 사실인가? 그렇다면 왜? 기본 싱글 링크드리스트 클래스의 경우

답변

1

당신은 의 디자인을 복사하는 것보다 더 나쁠 수 있습니다. sgi의 템플릿 라이브러리 ("stl")는 "stl"이라고하는 C++ 표준 라이브러리의 일부입니다. ". 불행하게도 slist은 그것을 만들지 않았다. (그것의 이중 연결된 사촌 list OTOH는 그것을 만들었고, std::list가되었다). 그러나 나는 그것을 좋아한다.

페이로드 유형과 할당자를 템플릿으로 만들지 않으려면 하드 코드하는 것이 좋습니다. 하지만 유지해야 할 핵심 포인트는 "노드"가 내부 구현의 세부 사항이라는 것입니다. 컨테이너 유형을 모든 정교한 표준 측면과 함께 만 공개합니다 (물론 페이로드 유형을 알려줘야합니다.) 이 아닌 열심히 그것을 템플릿, btw ;-), 당신은 당신의 .h (단지 class node;, 그리고 귀하의 class slist에있는 포인터가 포함되어 있습니다)에서 "노드"불투명 한 클래스합니다.

3

, 내가 권하고 싶습니다 : 각 노드를 할당 한 후

  • 가 이동하거나 노드를 복사하지 마십시오 그것은 따라서
  • 을 할당있어 후 해제 노드 클래스 복사 생성자 및 할당 연산자

C++는 정의하지 않은 경우 기본 복사 생성자 및 할당 연산자를 생성합니다. 이러한 기본값을 개인용으로 선언하고 구현하지 않은 채 사용하지 않도록 설정하는 것이 좋습니다.


는하지만 인터넷에서 본 것과, List 클래스는 노드의 복사 처리한다. 이것이 사실인가? 그렇다면 왜?

전체 목록 복사 (복사본 만들기) (목록의 모든 노드 사본 만들기)를 지원하므로 노드 복사가 필요합니다.

전체 목록 복사를 지원하지 않으면 노드 복사를 지원할 필요가 없습니다.

0

당신이 단일 연결리스트가 있다면 :

A1 -> B1 -> C1 

를하고는 다시 내부 노드 * 회원에 복사 생성자를 호출, 자신의 복사 생성자를 작성, 당신은 얻을 것이다 :

A1 -> B1 -> C1 
A2 -> B2 -> C2 

뭘하지 말아야 할 것은 계단식 복사를 수행하지 않습니다 암시 적으로 생성 된 복사 생성자를 호출하고, 당신이 얻을 것은 :

 A2 
     | 
     v 
A1 -> B1 -> C1 
,536,

딥 복사를 수행하기 위해 자신의 복사본 생성자를 작성하거나 작업을 수행하지 않는 개인용 사본 생성자를 정의하십시오.

BTW std :: list는 이중 연결 목록을 구현하고 딥 복사 의미를 구현합니다.