2017-01-26 1 views
0

저는 C++의 초보자입니다. 최근에 링크드 라이징을 연습 할 때, 클래스 생성자에 초기화리스트를 사용하여 NULL을 head-> next에 할당하려고했습니다.초기화 목록에서 화살표 연산자를 사용할 수없는 이유는 무엇입니까?

클래스 생성자에서 내 화살표 연산자가 "예상 된 '('또는 '{'") 왜 그런 오류가 있습니까? (블록에있는 클래스 멤버를 초기화 할 수 있지만 왜 't 나는이 포인터로 이렇게) 감사

여기 LinkedList의 내 헤더 파일이다 :?!

linkedlist.h

#include <iostream> 
using namespace std; 

struct node { 
int val; 
node *next; 
}; 

class linkedlist { 
private: 
node *head; 
int listlen; 

public: 
linkedlist(); 
void insert(node*, int); 
void del(node*); 
void reverse(node*); 
void traverse(node*); 
int random(); 
~linkedlist(); 

}; 

그리고 여기 내 클래스 생성자의 :

linkedlist.cpp 일반적으로

#include "linkedlist.h" 
#include <iostream> 

linkedlist::linkedlist() :listlen(0), head->next(NULL){} 
+2

두 가지 문제 : 먼저 'head'가 초기화되지 않았습니다. 둘째, 이니셜 라이저 목록에 표현식을 사용할 수 없습니다. –

+0

@Someprogrammerdudu 상수 표현은 어떨까요? –

+0

왜? 그게 바로 언어가 어떻게 설계 되었기 때문입니다. (아마도 초기화 목록은 항상 객체 자체를 초기화하기위한 것이지 멤버가 가리킬 수있는 다른 객체는 아닙니다.) – TheUndeadFish

답변

1

만 초기화 목록의 일부로서 회원 자신을 초기화 할 수 있습니다. 그게 유일한 문제 였다면 다음 포인터를 NULL으로 초기화하여 ctor의 본문으로 만들 수 있습니다. 그러나 귀하의 멤버 변수 head 자체가 포인터이며, 현재 어디를 가리 키지 않는, 그래서 당신이 실제로 (나중에 C를 사용하는 경우 ++ (11) 또는 nullptr 또는) NULLhead 자체를 설정하고 싶어 의심 :

linkedlist::linkedlist() :listlen(0), head(NULL) {}

또한 struct node에 ctor를 추가하여 초기화시 next에서 NULL으로 초기화하는 것이 좋습니다. 그 초기화리스트들이 ctor에에 기록 된 순서대로 실행되지 않습니다

  1. 주, 오히려 : 당신이 말한 이후

    다른 몇 가지 당신이 익숙하지 지적 가치가있을 수 있다고 생각 멤버가 클래스의 본문에 정의 된 순서대로. 이 경우 이 초기화 된 후에 만 ​​listlen이 실제로 0으로 초기화됩니다. 이 코드는 여기서는 중요하지 않지만 멤버 초기화가 더 복잡하고 종속성이있는 경우 중요 할 수 있습니다. 개인적으로, 회원 목록의 순서와 일치하는 초기화 목록의 순서를 항상 유지하는 것이 좋습니다. 특정 컴파일러에는 그렇지 않은 경우 경고 플래그가 있습니다.

  2. 자신의 링크 된 목록을 구현하는 대신 표준 라이브러리의 데이터 구조를 사용 해본 적이 있습니까? cppreference.com에서 많은 정보를 얻을 수 있습니다. 특히 사용 사례에 따라 'list', 'vector'또는 'deque'를 확인하십시오.

+0

입력 해 주셔서 감사합니다. 초기화 순서를 염두에 두겠다. 그리고 데이터 구조 자체와 관련하여 헤드 포인터를 NULL로 초기화하고 head-> next를 NULL로 둘 다 필요합니까? –

+0

그렇게하지 않는 한 정의되지 않은 값을 갖게 될 것입니다. 이는 포인터가 유효하지 않음을 의미하며, 역 참조를 시도하면 SEGV가 발생할 가능성이 높습니다. 따라서 대부분의 경우 명시 적으로 초기화하여 나중에 값에 대해 추론 할 수 있습니다. "대부분의 경우"라고 말합니다. 때로는 초기화 상태가 될 때까지 멤버에게 액세스하지 못하도록 다른 상태를 유지할 수 있기 때문입니다. – TKL

관련 문제