指向相同类型的对象

时间:2012-06-05 18:12:51

标签: c++ visual-c++ pointers nested-class

我觉得这个问题可能有点微不足道,但我根本无法绕过它。我目前有一个类Node,它试图使用指针prevNode指向当前节点之前发生的节点。但是我似乎无法访问prevNode中的任何变量。

从以下代码运行Main.cpp时,它会打印结果'15340756'。我哪里错了?作为我仍然有点新的C ++。

Node.h

#include "stdafx.h"

class Node
{
public:
    Node();
    void setPrevNode(Node n);
    Node getPrevNode();
    int i;
private:
    Node *prevNode;
};

Node.cpp

#include "stdafx.h"
#include "Node.h"

Node::Node(){
    i = 0;
}

void Node::setPrevNode(Node n){
    prevNode = &n;
}

Node Node::getPrevNode(){
    return *prevNode;
}

Main.cpp的

#include "stdafx.h"
#include "Node.h"


int _tmain(int argc, _TCHAR* argv[])
{
    Node nodes[] = {Node(), Node()};

    nodes[0].i = 1;
    nodes[1].setPrevNode(nodes[0]);
    printf("%i", nodes[1].getPrevNode().i); 
    while(true){

    }
    return 0;
}

1 个答案:

答案 0 :(得分:7)

void setPrevNode(Node n);

此处声明setPrevNode采用作为参数传递的节点的副本,并指向此类节点。函数返回后,指向的节点不再存在,你得到的是未定义的行为。

你想要的是将Node作为参考或指针代替:

void setPrevNode(Node& n)
{
    prevNode = &n;
}

void setPrevNode(Node* n)
{
    prevNode = n;
}

在同一行,getPrevNode定义为返回上一个节点的副本。你当然希望在这里返回一个引用,尽管你也可以返回一个指针:

Node& getPrevNode()
{
    return *prevNode;
}

Node* getPrevNode()
{
    return prevNode;
}