Передача базового конструктора из класса?

#c #debugging #object #binary-search-tree

#c #отладка #объект #двоичное дерево поиска

Вопрос:

  void MovieTree::addMovieNode(int ranking, std::string title, int releaseYear, int quantity)
    {

        std::cout<<"Adding root"<<std::endl;
        if(root == NULL)
        {
            std::cout<<"enter root"<<std::endl;
            MovieNode* root = new MovieNode;    
            root->ranking = ranking;
            root->title = title;
            root->year = releaseYear;
            root->quantity = quantity;
            root->leftChild = root->rightChild = NULL;
            std::cout<<"Item added"<<std::endl;
            std::cout<<title<<std::endl;

        }   

        else if(root)
        {
            std::cout<<"skipped root"<<std::endl;
            MovieNode* newNode = new MovieNode;
            newNode->ranking = ranking;
            newNode->title = title;
            newNode->year = releaseYear;
            newNode->quantity = quantity;


            MovieNode* currentNode = root;
            MovieNode* previousNode = currentNode;

            while(currentNode)
            {
                previousNode = currentNode;

                if(currentNode->title.compare(title) > 0)
                {
                    currentNode = currentNode->rightChild;
                }
                else if(currentNode->title.compare(title) < 0)
                {
                    currentNode = currentNode->leftChild;
                }

            }

            if(previousNode->title.compare(title) > 0)
            {
                previousNode->rightChild = newNode;
            }
            else if(previousNode->title.compare(title) <0)
            {
                previousNode->leftChild = newNode;
            }
        }

    }
  

Это код для бинарного дерева поиска.
У меня возникли некоторые проблемы с моей функцией «addMovieNode». Он никогда ввода исходных случае, когда я инициализации первого узла по британскому летнему времени.
Я подозреваю, что в значительной степени это связано с моим непониманием того, как передать первый конструктор в моем ‘main.cpp — водитель.

 #include "MovieTree.hpp"
#include <iostream>

MovieTree::MovieTree()
{
    MovieNode* root = NULL;

}

void MovieTree::printMovieInventory()
{
    printMovieInventory(root);
}
void MovieTree::printMovieInventory(MovieNode* node)
{
    if(node)
    {
        while(node->rightChild amp;amp; node->leftChild)
        {
            std::cout<<"Movie:"<<node->title<<" "<<node->quantity<<std::endl;
            if(node->rightChild)
            {
                printMovieInventory(node->rightChild);
            }
            if(node->leftChild)
            {
                printMovieInventory(node->leftChild);
            }
        }
    }
    else
    {
        std::cout<<"No movies in list!"<<std::endl;
    }
}

void MovieTree::addMovieNode(int ranking, std::string title, int releaseYear, int quantity)
{

    std::cout<<"Adding root"<<std::endl;
    if(root == NULL)
    {
        std::cout<<"enter root"<<std::endl;
        MovieNode* root = new MovieNode;    
        root->ranking = ranking;
        root->title = title;
        root->year = releaseYear;
        root->quantity = quantity;
        root->leftChild = root->rightChild = NULL;
        std::cout<<"Item added"<<std::endl;
        std::cout<<title<<std::endl;

    }   

    else if(root)
    {
        std::cout<<"skipped root"<<std::endl;
        MovieNode* newNode = new MovieNode;
        newNode->ranking = ranking;
        newNode->title = title;
        newNode->year = releaseYear;
        newNode->quantity = quantity;


        MovieNode* currentNode = root;
        MovieNode* previousNode = currentNode;

        while(currentNode)
        {
            previousNode = currentNode;

            if(currentNode->title.compare(title) > 0)
            {
                currentNode = currentNode->rightChild;
            }
            else if(currentNode->title.compare(title) < 0)
            {
                currentNode = currentNode->leftChild;
            }

        }

        if(previousNode->title.compare(title) > 0)
        {
            previousNode->rightChild = newNode;
        }
        else if(previousNode->title.compare(title) <0)
        {
            previousNode->leftChild = newNode;
        }
    }

}


void MovieTree::findMovie(std::string title)
{
    if(search(title))
    {
        MovieNode* foundMovie = search(title); 
        std::cout<< "Movie Info:"<<std::endl;
        std::cout<< "==========="<<std::endl;
        std::cout<< "Ranking:"  <<foundMovie->ranking<<std::endl;
        std::cout<< "Title:"        <<foundMovie->title<<std::endl;
        std::cout<< "Year:"     <<foundMovie->year<<std::endl;
        std::cout<< "Quantity:" <<foundMovie->quantity<<std::endl;
    }
    else
    {std::cout<<"Movie not found."<<std::endl;}
}

MovieNode* MovieTree::search(std::string title)
{
    if(root)
    {
        MovieNode* temp = root;
        while(temp amp;amp; temp->rightChild amp;amp; temp->leftChild)
        {
            if(!temp)
            {
                if(temp->title == title)
                {
                    return temp;
                }
                else if(temp->title.compare(title) > 0)
                {
                    temp = temp->rightChild;
                }
                else if(temp->title.compare(title) < 0)
                {
                    temp = temp->leftChild;
                }
            }

        }
    }
    else
    {
        std::cout<<"Root does not exist! Movie not found!n";
    }
}

void MovieTree::rentMovie(std::string title)
{
    if(search(title))
    {
        MovieNode* foundMovie = search(title);

        if(foundMovie->quantity > 0)
        {
            foundMovie->quantity--;
            std::cout<<"Movie has been rented."<<std::endl;
            std::cout<<"Movie Info:"<<std::endl;
            std::cout<<"==========="<<std::endl;
            std::cout<<"Ranking:"<<foundMovie->ranking<<std::endl;
            std::cout<<"Title:"<<foundMovie->title<<std::endl;
            std::cout<<"Year:"<<foundMovie->year<<std::endl;
            std::cout<<"Quantity:"<<foundMovie->quantity<<std::endl;
        }
        else if(foundMovie->quantity == 0)
        {
            std::cout<<"Movie out of stock"<<std::endl;
        }
    }
    else if(!search(title))
    {
        std::cout<<"Movie not found."<<std::endl;
    }
}
  

Ссылка в main.cpp заключается в следующем:

  MovieTree movieTree;

 MovieTree();


 movieTree.addMovieNode(12, "The good and bad", 1870, 12);
 cout<<"Added"<<endl;
  

Я получаю ошибку сегментации после того, как значения передаются через функцию, и она никогда не входит в начальный оператор if (root)

Ответ №1:

В addMovieNode функции вы объявляете локальную переменную root :

 MovieNode* root = new MovieNode;
  

Это скрывает переменную root , которая является членом класса.

Исправление заключается в удалении объявления, чтобы вместо этого был изменен член класса:

 root = new MovieNode;
  

То же самое происходит в вашем конструкторе:

 MovieTree::MovieTree()
{
    MovieNode* root = NULL;
}
  

Это также необходимо изменить на simply root = NULL; .

Комментарии:

1. @Jonathan_Potter Спасибо!