修改自己类的本地实例

时间:2012-11-07 01:11:10

标签: c++

我有一个类,其中一个私有属性是该类的实例。在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;
    }
}

4 个答案:

答案 0 :(得分:4)

Pi变为引用或指向Node的指针。

  1. 引用(Node& Pi)将导致更好的语法,但不能为null,必须在构造时初始化,并且不能更改为引用不同的对象。
  2. 指针(Node* Pi)需要不太漂亮的语法,但可以为null,可以在不同时间指向不同的对象。
  3. 有关详细信息,请参阅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; 
};