2012-11-07 2 views
0

개인 속성 중 하나가 클래스의 인스턴스 인 클래스가 있습니다. (나는 자바에 익숙하기 때문에) 자바에서는이 보이는 같은 :자신의 클래스의 로컬 인스턴스 수정

class Node { 
    private Node Pi; 
} 

그리고 지금은 C++에서 이것을 쓰고 있어요, 나는 같은 일을하려고 할 때, 나는 '(빨간색 밑줄을 얻을 m Visual C++ 2010 Express 사용), "불완전한 형식이 허용되지 않습니다".

class Node { 
    private: 
     Node Pi; //Incomplete type is not allowed 
}; 

내가 Node Pi(void);로 변경하지만 난 얻을이 속성을 수정하는 다른 기능을 사용하려고하는 이유 다음 "표현은 수정 좌변해야한다"하여이를 해결하려고했습니다.

class Node { 
    private: 
     Node Pi(void); 
    public: 
     void setPi(Node n); 
}; 
void Node::setPi(Node n) { 
    Pi = n; //Node Node::Pi() expression must be a modifiable lvalue 
} 

일반적으로 Java에는 문제가 없으므로 제 질문은 어떻게 구현합니까? 나는 C++의 초보자는 아니지만, 잠시 동안은 쓰지 않았다.

class Node { 
    private Node Pi; 
    void setPi(Node n) { 
     this.Pi = n; 
    } 
} 
+0

"불완전한 형식이 허용되지 않음"은 아직 완전히 정의되지 않은 클래스의 인스턴스를 만들 수 없음을 의미합니다. 클래스는 컴파일러가 닫는 중괄호와 세미콜론을 읽을 때까지 "완료"되지 않습니다. 클래스는 자신의 인스턴스를 포함 할 수 없습니다. 그것은 원형 정의가 될 것입니다. – Wyzard

답변

4

참조 또는 Node에 대한 포인터로 전환 Pi.

  1. 참조 (Node& Pi)이 보이는데 구문 될 것이지만, 널이 될 수없는 구조로 초기화되어야 할 것이며, 다른 오브젝트를 참조하도록 변경 될 수 없다.
  2. 포인터 (Node* Pi)는 구문이 덜 필요하지만 null 일 수 있으며 다른 시점에 다른 개체를 가리 키도록 만들 수 있습니다.
  3. 자세한 내용은

, What are the differences between a pointer variable and a reference variable in C++?

1

이 시도 참조 : (직접 객체 대신 클래스의 객체에 대한 포인터를 보내기)

class Node { 
    private: 
     Node* Pi(void); 
    public: 
     void setPi(Node* n); 
}; 

void Node::setPi(Node* n) { 
    Pi = n; //Node Node::Pi() expression must be a modifiable lvalue 
} 

자바 '- 마술 자동'C와 그 개체를 변환 ++, 너 혼자해야 해.

0

변경 다음 코드를

class Node { 
    private: 
     Node Pi; //Incomplete type is not allowed 
}; 

하려면 :

class Node { 
    private: 
     Node* Pi; 
}; 
1

자바의 구문은 모든 곳에서 포인터를 사용한다는 사실을 숨 깁니다. C++에서 Java를 모방하기 위해 포인터 구문을 명시 적으로 사용해야합니다.

// Java 
class Node { 
    private Node Pi; // This is actually a pointer 
} 

// C++ 
class Node { 
    private: 
     Node *Pi; // So you use a pointer in C++ too 
}; 
관련 문제