Вектор ошибки уникальных указателей, на который нельзя ссылаться после инициализации - PullRequest
0 голосов
/ 03 марта 2019

Я пытаюсь создать матрицу прямоугольников в SFML и сделать их похожими на пол.Для этого я хочу использовать вектор уникальных указателей.Однако, кажется, есть ошибка, которую я не совсем понимаю.

После успешной инициализации вектора он объявляется удаленным в той же самой функции.Когда я выполняю аналогичную реализацию, но использую new или совместно используемые указатели, проблем не возникает.

В чем причина этой ошибки и как ее исправить?Место происшествия видно на рисунке ниже:

PNG of formatted code

Код:

sf::Texture texture;

texture.loadFromFile("./resources/wood.jpg");

std::vector<std::unique_ptr<sf::Sprite>> floor;
unsigned counter = 0;
float posX = 0.f, posY = 0.f;
for (int i = 0; i < 50; i++) {
    floor.push_back(std::make_unique<sf::Sprite>());
    floor[i]->setTexture(texture);
    floor[i]->setTextureRect(sf::IntRect(1, 1, 100, 100));
    floor[i]->setPosition(sf::Vector2f(posX, posY));
    counter++;
    posX += 100.f;
    if (counter == 10) {
        posY += 100.f;
        posX = 0.f;
        counter = 0;
    }
}

while (window.isOpen()) {
    sf::Event eH;

    for (auto &sprite : floor)
        window.draw(*sprite.get());

    while (window.pollEvent(eH)) {
        if (eH.type == sf::Event::Closed)
            window.close();
        if (eH.type == sf::Event::KeyReleased && eH.key.code == sf::Keyboard::Escape)
            window.close();
        if (eH.type == sf::Event::Resized)
            glViewport(0, 0, eH.size.width, eH.size.height);
    }

    window.display();
    window.clear(sf::Color::Black);

Описание ошибки:

Код серьезности Описание Ошибка состояния подавления строки файла проекта C2280 'std :: unique_ptr> :: unique_ptr (const std :: unique_ptr <_Ty, std :: default_delete <_Ty >> &) ': попытка сослаться на удаленную функцию SMFLsetup c: \ users \ 808hunterz records \ source \ repos \ smflsetup \ smflsetup \ smflsetup.cpp 41

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

sf::Sprite легкий, вам не нужно использовать std::unique_ptr<sf::Sprite>, просто используйте sf::Sprite напрямую: std::vector<sf::Sprite> floor;

std::vector<sf::Sprite> floor;
...
floor.push_back(sf::Sprite());
floor[i].set...
...
for (auto const& sprite : floor)
    window.draw(sprite);
0 голосов
/ 03 марта 2019

Эта строка

for (auto sprite : floor)

пытается скопировать каждый unique_ptr в sprite по одному, и unique_ptr s не копируется.

Использовать

for (auto &sprite : floor)

вместо.

...