2

この質問は少し些細なことかもしれませんが、頭を包むことはできません。現在、ノードprevNodeポインターを使用して、現在のノードの前に発生するノードをポイントしようとしているクラスNodeがあります。ただし、prevNode内の変数にアクセスできないようです。

次のコードからMain.cppを実行すると、結果「15340756」が出力されます。どこが間違っているのですか?Imとしての謝罪はまだ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;
}
4

1 に答える 1

7
void setPrevNode(Node n);

Hereは、引数として渡されたノードのコピーを取得し、そのノードを指すようにsetPrevNode宣言されています。関数が戻った後、ポイントされたノードは存在しなくなり、未定義の動作が得られます。

あなたが望むのは、Node代わりに参照またはポインタのいずれかを取ることです:

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

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

同じ行で、前のノードのコピーgetPrevNodeを返すように定義されています。ポインターを返すこともできますが、代わりにここで参照を返すことをお勧めします。

Node& getPrevNode()
{
    return *prevNode;
}

Node* getPrevNode()
{
    return prevNode;
}
于 2012-06-05T18:14:42.467 に答える