Нарушение прав доступа на чтение std :: shared_ptr - PullRequest
0 голосов
/ 10 июля 2020

Я работаю над личным проектом с использованием SFML и C ++. В проекте есть интерфейс и несколько кнопок. Итак ... у меня есть класс SortingAlgorithms, который будет базовым классом и подклассом BubbleSort

class SortingAlgorithms 
{
protected:
    std::vector<sf::RectangleShape> sequence;
    sf::RenderWindow& window;
    int minimum, maximum;
    int elements;

public:
    SortingAlgorithms();

    // Class constructor which initializes a sequence
    SortingAlgorithms(int min, int max, int els, sf::RenderWindow& win);

    std::vector<sf::RectangleShape> GetSequence() const;

    // A pure virtual function for overriding 
    virtual void Sort(std::unique_ptr<Interface>& init) = 0;

    // A method for printing the sequence
    void Print(std::unique_ptr<Interface>& init);
};

class BubbleSort : public SortingAlgorithms
{
public:
    BubbleSort(int min, int max, int els, sf::RenderWindow& win);
    void Sort(std::unique_ptr<Interface>& init);
};

Основная проблема заключается в методе Sort, который также имеет некоторые события кнопок. В этом методе я пытаюсь просто распечатать последовательность или отсортированную последовательность, используя std::shared_ptr(generatedAlg), который будет инициализирован в этой ветке if (selectedAlg == "Bubble Sort"); все работает нормально, но если до этого дойдет if ((*it).DetectButton(window) == true && (*it).GetButton() == "Sort"), я получаю

Exception thrown: read access violation.
std::shared_ptr<SortingAlgorithms>::operator-><SortingAlgorithms,0>(...) returned nullptr.

Аналогично происходит, когда я пытаюсь выделить его вручную:

Run-Time Check Failure #3 - The variable 'generatedAlg' is being used without being initialized.

Есть ли способ решить этот вопрос?

void Interface::ConfigBar(std::unique_ptr<Interface>& init)
{
    while (window.isOpen())
    {
        sf::Event event;
        std::shared_ptr<SortingAlgorithms> generatedAlg;
        
        while (window.pollEvent(event))
        {
            for (std::vector<Button>::iterator it = configButtons.begin(); it != configButtons.end(); it = std::next(it))
            {
                switch (event.type)
                {
                case sf::Event::Closed:
                    window.close();
                case sf::Event::MouseMoved:
                    if ((*it).DetectButton(window) == true)
                    {
                        (*it).SetTextColor(sf::Color::White);
                    }
                    else
                    {
                        (*it).SetTextColor(sf::Color::Black);
                    }
                    break;
                case sf::Event::MouseButtonPressed:
                    if ((*it).DetectButton(window) == true && (std::distance(configButtons.begin(), it) != 5 && std::distance(configButtons.begin(), it) != 6 && std::distance(configButtons.begin(), it) != 9))
                    {
                        (*it).SetShapeColor(sf::Color(0, 109, 119));
                    }
                    break;
                case sf::Event::MouseButtonReleased:
                    if ((*it).DetectButton(window) == true && (std::distance(configButtons.begin(), it) != 5 && std::distance(configButtons.begin(), it) != 6 && std::distance(configButtons.begin(), it) != 9))
                    {
                        (*it).SetTextColor(sf::Color::Black);
                        (*it).SetShapeColor(sf::Color(42, 157, 143));
                    }
                    if ((*it).DetectButton(window) == true && (*it).GetButton() == ">")
                    {
                        inputMin += 10;
                        configButtons.at(5).SetButton(std::to_string(inputMin));
                    }
                    if ((*it).DetectButton(window) == true && (*it).GetButton() == "<")
                    {
                        inputMax += 10;
                        configButtons.at(6).SetButton(std::to_string(inputMax));
                    }
                    if ((*it).DetectButton(window) == true && (*it).GetButton() == "+")
                    {
                        inputEls += 1;
                        configButtons.at(9).SetButton(std::to_string(inputEls));
                    }
                    if ((*it).DetectButton(window) == true && (*it).GetButton() == "-")
                    {
                        inputEls -= 1;
                        if (inputEls < 0)
                        {
                            inputEls = 0;
                            std::cerr << "Cannot be less than 0" << std::endl;
                        }
                        configButtons.at(9).SetButton(std::to_string(inputEls));
                    }
                    if ((*it).DetectButton(window) == true && (*it).GetButton() == "Reset")
                    {
                        inputMin = 0;
                        inputMax = 0;
                        inputEls = 0;
                        configButtons.at(5).SetButton(std::to_string(inputMin));
                        configButtons.at(6).SetButton(std::to_string(inputMax));
                        configButtons.at(9).SetButton(std::to_string(inputEls));
                    }
                    if ((*it).DetectButton(window) == true && (*it).GetButton() == "Generate")
                    {
                        if (inputMin == 0 || inputMax == 0 || inputEls == 0)
                        {
                            std::cout << "Cannot generate a sequence by default configuration" << std::endl;
                            break;
                        }
                        if (selectedAlg == "Bubble Sort")
                        {
                            generatedAlg = std::make_shared<BubbleSort>(inputMin, inputMax, inputEls, window);
                            generatedAlg->Print(init);
                        
                        }
                        std::cout << "Sequence generated" << std::endl;
                    }
                    if ((*it).DetectButton(window) == true && (*it).GetButton() == "Sort")
                    {
                        //generatedAlg = std::make_shared<BubbleSort>(inputMin, inputMax, inputEls, window);
                        generatedAlg->Sort(init);
                        
                        std::cout << "The sequence is now sorted" << std::endl;
                    }
                case sf::Event::KeyPressed:
                    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Escape))
                    {
                        if (algorithmType == "Sorting Algorithms")
                            SortingAlgMenu(init);
                        PathAlgMenu(init);
                    }
                    break;
                default:
                    break;
                }
            }
        }
        window.clear(sf::Color(sf::Color::White));
        for (std::vector<Button>::iterator it = configButtons.begin(); it != configButtons.end(); it = std::next(it))
        {
            (*it).Draw(window);
        }
        window.display();
    }
}
...