2012-11-07 99 views
0

我有一個類,其中一個私有屬性是類的一個實例。在Java(因爲我已經習慣了Java的),這看起來像:修改自己類的本地實例

class Node { 
    private Node Pi; 
} 

現在我在C++寫這個,當我試圖做同樣的事情,我得到一個紅色下劃線(I」 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

Pi轉換爲參考或指向Node的指針。

  1. 的引用(Node& Pi)將導致更好的語法,但不能爲空,將具有結構被初始化,並且不能被改變爲指的是不同的對象。
  2. 指針(Node* Pi)將需要較少的漂亮語法,但可以爲空,並且可以在不同時間指向不同的對象。

有關詳細信息,請參閱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 
} 

Java的自動神奇地「轉換這些對象,用C++,你必須自己做。

0

更改下面的代碼:

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

要:

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

Java的語法隱藏了它使用了指針無處不在的事實。在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 
};