0

プライベート プロパティの 1 つがクラスのインスタンスであるクラスがあります。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++ の初心者ではありませんが、しばらく C++ で書いていません。

class Node {
    private Node Pi;
    void setPi(Node n) {
        this.Pi = n;
    }
}
4

4 に答える 4

4

Piへの参照またはポインタに変わりますNode

  1. 参照(Node& Pi)を使用すると構文が改善されますが、nullにすることはできず、構築時に初期化する必要があり、別のオブジェクトを参照するように変更することはできません。
  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 に答える