2014-06-22 2 views
1

나는 C++의 기본의 묘리를 터득 노력하고, 나는이 코드 조각에 붙어에 클래스에 대한 포인터를 설정할 때 : 나는를 실행하면오류 : 타입의 이름이없는, 0

#include<iostream> 

using namespace::std; 

class Node 
{ 
public: 
    int x; 
    Node *ptr_next; 

}; 

class LinkedList 
{ 
public: 
    Node *head; 
    head = 0; //If I comment out this line the code compiles 
}; 

int main() 
{ 
    LinkedList linked_list; 
    return 0; 
} 

나는이 오류가 발생 위 : 나는 0head을 설정할 수없는 이유

error: ‘head’ does not name a type 

는 이해가 안 돼요; 나는 this question을 보았고 위의 오류의 가능한 원인은 컴파일러가 어떤 클래스를 참조했는지 알지 못하는 것 같습니다 (내 경우 Node). 그러나, 여기에 해당해서는 안됩니다. 을 Node에 대한 포인터로 선언하면 내 코드가 정상적으로 실행되기 때문입니다. 그것은 을 0으로 설정하려 할 때 위의 오류가 발생합니다. 내가 뭘 놓치고 있니?

은 내가 LinkedList 클래스를 무시하고에 main을 변경하는 경우 :

int main() 
{ 
    Node *head; 
    head = 0; 
    return 0; 
} 

코드는 잘 컴파일합니다. 따라서 내가 누락 된 것은 NodeLinkedList 사이의 상호 작용입니다. 이게 뭐야?

+3

NSDMI 또는 생성자를 사용하십시오. – chris

+2

클래스 선언에서 (const int와 같은 것을 사용하지 않는 한) 물건을 초기화하는 코드를 작성할 수 없으므로 생성자를 사용하십시오. –

+0

두 가지 모두 'LinkedList'에 생성자를 추가하여 문제를 해결했습니다. – Akavall

답변

4

C++ 11은 비 정적 데이터 멤버의 클래스 초기화를 허용합니다. 이 표준에 중괄호 또는 동등한 이니셜 라이저이라고합니다. 이니셜 라이저는 데이터 멤버의 선언에 나타나야합니다. 하지만 당신은 그것을 별도의 문장으로 초기화하려고합니다. 중괄호 또는 동등한-초기화가 암시 이름으로,

class LinkedList 
{ 
public: 
    Node *head = nullptr; // don't use 0 to initialize pointers 
}; 

에 코드를 변경하고, 초기화는 또한 보강-초기화 목록를 사용하여 수행 할 수 있습니다. 그래서 다음과 같은 작품도

class LinkedList 
{ 
public: 
    Node *head{}; // value-initializes the pointer 
}; 
관련 문제