0

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

4 回答 4

4

变成Pi引用或指向Node.

  1. 引用 ( Node& Pi) 将产生更好的语法,但不能为空,必须在构造时初始化,并且不能更改为引用不同的对象。
  2. 指针 ( Node* Pi) 不需要漂亮的语法,但可以为 null 并且可以在不同时间指向不同的对象。

有关更多详细信息,请参阅C++ 中的指针变量和引用变量有什么区别?

于 2012-11-07T01:12:22.667 回答
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++,你必须自己做。

于 2012-11-07T01:14:33.817 回答
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
};
于 2012-11-07T01:20:55.237 回答
0

更改以下代码:

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

到:

class Node {
    private:
        Node* Pi; 
};
于 2012-11-07T01:15:52.370 回答