修改自己类的本地实例

Modify a local instance of own class

本文关键字:实例 自己 修改      更新时间:2023-10-16

我有一个类,其中一个私人属性是该类的实例。在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);来解决此问题,但是为什么我尝试使用另一个修改此属性的函数,我得到的"表达式必须是可修改的lvalue"。

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;
    }
}

Pi变成参考或指向Node的指针。

  1. 参考(Node& Pi)将导致语法更好,但不能无效,必须在构造时初始化,并且不能更改以参考其他对象。
  2. 指针(Node* Pi)将需要较少的漂亮语法,但可以为null,并且可以在不同时间指向不同的对象。

有关更多详细信息,请参阅C ?

中的指针变量与参考变量之间有什么区别。

尝试以下操作:(将指针直接发送到对象而不是类对象)

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 ,您必须自己做。

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
};

更改以下代码:

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

to:

class Node {
    private:
        Node* Pi; 
};