1

簡単なノードクラスを実装しようとしましたが、ルートノードを介して子ノードにアクセスしようとすると空になりますが、子ノードに直接アクセスすると、正しく入力されます。どこかに論理的な間違いがありますか、それとも誰かが私に何が悪いのかというヒントを与えることができますか?

Node::Node(QString name, Node *parent)
{
    this->name = name;
    this->parent = parent;

    parent->children.append(this);
}

\\

 class Node
    {
    public:
        Node(QString name) { this->name = name; }
        Node(QString name, Node *parent);
        ~Node(void);

    void addChild(Node *child);

    QString getName() { return name; }
    Node* getChild(int row) { return children[row]; }
    Node* getParent() { return parent; }

    int childCount() { return children.size(); }
    int getRow() {return this->parent->children.indexOf(this);}

    QString log(int tabLevel = -1);

private:
    QString name;
    QList<Node*> children;
    Node *parent;
};

間違いを見つけようとしましたが、結果として、子ノードには2つの異なるアドレスがあるように見えるため、2つの異なるオブジェクトがありますが、理由はわかりません:/

    Node rootNode = Node("rootNode");
Node childNode0 = Node("childNode0", &rootNode);
Node childNode1 = Node("childNode1", &rootNode);
Node childNode2 = Node("childNode2", &rootNode);
Node childNode3 = Node("childNode3", &childNode0);
Node childNode4 = Node("childNode4", &childNode0);

qDebug() << "RootNode: " + rootNode.getName() << " | RootChilds: " << rootNode.childCount();
qDebug() << "NodeName: " +rootNode.getChild(0)->getName() << " | NodeChilds: " << rootNode.getChild(0)->childCount();

for(int i = 0; i < childNode0.childCount(); i++)
{
    qDebug() << "NodeName: " << childNode0.getName() << " | NodeChilds: " << childNode0.childCount() << "Child Nr: " << i << " Name -> " << childNode0.getChild(i)->getName();
} 

qDebug() << "Adress via root: " << rootNode.getChild(0) << "\nAdress via node: " << &childNode0 ;

}

その出力:

"RootNode: rootNode"  | RootChilds:  3 
"NodeName: childNode0"  | NodeChilds:  0 
NodeName:  "childNode0"  | NodeChilds:  2 Child Nr:  0  Name ->  "childNode3" 
NodeName:  "childNode0"  | NodeChilds:  2 Child Nr:  1  Name ->  "childNode4" 
Adress via root:  0x41fc84 
Adress via node:  0x41fcc0 

誰かが私を助けてくれることを願っています

よろしく

4

2 に答える 2

2

あなたがするとき、あなたは親Nodeに一時的なアドレスを与えていますNode

Node childNode0 = Node("childNode0", &rootNode);
//                ^ rootNode gets this temporary Node as its first child

Node一時的なものからコピーしてsを作成するのではなく、次のようにします。

Node childNode0("childNode0", &rootNode);
于 2013-01-01T05:02:55.477 に答える
0

return children[row];関数getChildが正しいとは思いません。本当にしたくないです*children.begin()か?

違いは、の配列があり、行番目のQListにアクセスすることをchildren[row]前提としているのに対し、実際にはQListの最初の要素を参照していることです。QList<Node*>'s*children.begin()

于 2013-01-01T04:39:17.487 に答える