0

学校のプロジェクト用にマネージ C++ でバイナリ ツリー クラスを作成する方法を見つけようとしています。アンマネージ C++ と C# で本当に良い例を見つけたので、何が起こっているのかかなりよく理解できましたが、マネージ C++ ではそれを理解できないようです。私が知りたいのは、なぜスタック オーバーフローが発生するのか (以下を参照)、これは賢明なアプローチなのかということです。これが私のクラスです:

#pragma once

#include "stdafx.h"
#include <iostream>
#include <deque>
#include <climits>

using namespace std;
using namespace System;
using namespace System::Collections;

ref struct Node
{
int data;
Node ^parent;
Node ^left;
Node ^right;

// constructors
// default constructor

Node (){}
// constructor that takes a node with no leafs
// a constructor that accepts a new node with no children
Node(int input)
{
    Node ^node = gcnew Node(input);
    node->data =input;
    node->left = nullptr;
    node->right = nullptr;
    node->parent = nullptr;
}

// method to create a new Node 
Node ^newNode(int data)
{
    Node ^node = gcnew Node;
    node->data = data;
    node->left = nullptr;
    node->right = nullptr;
    node->parent = nullptr;

    return node;
}

// method that inserts a new node into an existing tree
Node ^insertNode(Node ^node, int input)
{
    Node ^p;
    Node ^returnNode;
    if (node == nullptr)
    {
        returnNode = newNode(input);
        returnNode->parent = p;
        return returnNode;
    }

    if (input <= node->data)
    {
        p = node;
        node->left = insertNode(node->left, input);
    }

    else
    {
        p = node;
        node->right = insertNode(node->right, input);
    }
    return node;
}

};

新しいインスタンスを作成してノードを追加しようとすると、スタック オーバーフロー例外が発生します。

#include "stdafx.h"
#include "GenericNodeClass.h"
#include "BinarySearchTreeClass.h"

using namespace std;
using namespace System;

int main ()
{
BinarySearchTreeClass^ BTree = gcnew BinarySearchTreeClass();

Node ^newNode = gcnew Node(7);
newNode = newNode->insertNode(newNode, 6);  // this just looks stupid
return 0;
}
4

1 に答える 1

0

あなたのNodeコンストラクタで...

Node(int input)
{

...無条件にNodeコンストラクターを呼び出します...

    Node ^node = gcnew Node(input);

それはうまく終わらせることができません。Nodeコンストラクターで新しいものを作成するのはなぜNodeですか? Nodeコンストラクターが呼び出されると、オブジェクトを構築するために呼び出されます。*this新しい を作成する代わりにNode、現在のインスタンスを初期化する必要があります。

同様に、insertNodeメンバー関数でも、既に*thisオブジェクトにアクセスできます。別のパラメーターを介して渡す必要はありません。

于 2012-11-22T05:32:27.507 に答える