Я работаю над личным проектом с использованием 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();
}
}