1. ホーム
  2. c++

[解決済み] バイナリツリー - コピーコンストラクタ

2022-02-27 19:57:14

質問

バイナリツリーのコピーコンストラクタを作成しようとしています。

私の問題

ソースツリーの値がターゲットツリーにコピーされるのは見えるのですが、値を書き出すときに、コピーされたツリーには値がなく、プログラムがクラッシュしてしまいます。

エラーメッセージ

binTree.exe の 0x0097a43c で未処理の例外が発生しました: 0xC0000005: 場所 0xccccccec を読み取るアクセス違反。

コード

// メインメソッド

    int main(int argc, char **) {
    ifstream fin6("input_data.txt");
    ofstream out9("copied_tree.txt");

    if(!fin6.is_open()) 
    {
        cout << "FAIL" << endl;
        return 1;
    }

    BinaryTreeStorage binaryTreeStorage2;

    // read in values into data structure
    binaryTreeStorage2.read(fin6);

    BinaryTreeStorage binaryTreeStorage3 = binaryTreeStorage2;

    // output values in data structure to a file
    binaryTreeStorage3.write(out9);

    fin6.close();
    out9.close();

    // pause
    cout << endl << "Finished" << endl;
    int keypress; cin >> keypress;
    return 0;
}

// コピーコンストラクタ

BinaryTreeStorage::BinaryTreeStorage(BinaryTreeStorage &source)
{
    if(source.root == NULL)
        root = NULL;
    else
        copyTree(this->root, source.root);
}

// ツリーをコピーする方法

void BinaryTreeStorage::copyTree(node *thisRoot, node *sourceRoot)
{
    if(sourceRoot == NULL)
    {
        thisRoot = NULL;
    }
    else
    {
        thisRoot = new node;
        thisRoot->nodeValue = sourceRoot->nodeValue;
        copyTree(thisRoot->left, sourceRoot->left);
        copyTree(thisRoot->right, sourceRoot->right);
    }
}

解決方法は?

関数内でポインタの値(ポインティではない)を変更する場合、そのポインタへの参照を渡さなければなりません。

void BinaryTreeStorage::copyTree(node *& thisRoot, node *& sourceRoot)

関数にポインタを渡すと、このポインタは値で渡されます。ポインタの値(格納しているアドレス)を変更しても、その変更は関数の外からは見えません(これは、関数内で new ). そこで、関数の外で変更を見えるようにするには、変更したいポインタへの参照を渡す必要があります。

この質問 が詳しく説明しています。