我有一个类,其中一个私有属性是该类的实例。在Java中(因为我习惯于Java),这看起来像:
class Node {
private Node Pi;
}
现在我用C ++写这个,当我尝试做同样的事情时,我得到一个红色下划线(我使用的是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 :(得分:4)
将Pi
变为引用或指向Node
的指针。
Node& Pi
)将导致更好的语法,但不能为null,必须在构造时初始化,并且不能更改为引用不同的对象。Node* Pi
)需要不太漂亮的语法,但可以为null,可以在不同时间指向不同的对象。有关详细信息,请参阅What are the differences between a pointer variable and a reference variable in C++?
答案 1 :(得分: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 ++,你必须自己做。
答案 2 :(得分: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
};
答案 3 :(得分:0)
更改以下代码:
class Node {
private:
Node Pi; //Incomplete type is not allowed
};
要:
class Node {
private:
Node* Pi;
};