2012-06-05 2 views
2

Я чувствую, что этот вопрос может быть немного тривиальным, но я просто не могу обернуть вокруг него голову. В настоящее время у меня есть класс 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; 
} 

ответ

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

Я бы также добавить соответствующий 'getPrevNode', который возвращает указатель на' Node' показать следствие к ' setPrevNode', используя указатель. Этот ответ показывает хорошую работу, показывающую различия между передачей по значению, ссылке и указателю. – Kaiged

Смежные вопросы