2012-11-07 47 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 
};