【问题标题】:Vector of unique pointers error, cannot be referenced after initialization唯一指针向量错误,初始化后无法引用
【发布时间】:2019-07-25 01:31:48
【问题描述】:

我正在尝试在 SFML 中创建一个矩形矩阵,并让它们看起来像地板。为此,我想使用唯一指针向量。不过好像有一个我不太明白的错误。

在成功初始化向量后,它在同一个函数中被声明为删除。当我做类似的实现但使用new 或共享指针时,没有问题。

是什么导致了这个错误,我该如何解决?发生地点如下图:

代码:

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);

错误描述:

'std::unique_ptr<:sprite>>::unique_ptr(const std::unique_ptr<_ty>> &)': 试图引用一个删除功能

【问题讨论】:

  • 请勿发布“格式化代码的 PNG”,请改为发布您的代码。
  • 添加代码,不是代码截图。
  • 并复制粘贴 fullcomplete 错误输出(formatted 作为代码)。
  • 请花时间阅读tour 并阅读How to Ask,然后阅读edit 相应的问题。请创建a Minimal, Complete, and Verifiable example,并提供示例输入、输出和您收到的错误消息(如果有)。这将帮助我们确定正在发生的事情并提高您获得答案的机会。
  • 好的,当我再次要求时,我会记住这一点。

标签: c++ sfml unique-ptr


【解决方案1】:

这一行

for (auto sprite : floor)

尝试将每个unique_ptr 一个一个复制到sprite,而unique_ptrs 不可复制。

使用

for (auto &sprite : floor)

改为。

【讨论】:

  • 是的,就是这样,我唯一没有尝试放置修饰符 char 的地方 :) Ty
  • @2137Pablo 如果这回答了您的问题,请单击左侧的绿色勾号将您的问题标记为已解决。
【解决方案2】:

sf::Sprite是轻量级的,不需要使用std::unique_ptr&lt;sf::Sprite&gt;,直接使用sf::Sprite即可:std::vector&lt;sf::Sprite&gt; floor;

std::vector<sf::Sprite> floor;
...
floor.push_back(sf::Sprite());
floor[i].set...
...
for (auto const& sprite : floor)
    window.draw(sprite);

【讨论】:

  • 什么意思?所示示例中没有指针。
  • 这其实也是一个很好的方法,之前有一些问题导致我使用指针,所以这就是为什么我最终会这样。
猜你喜欢
  • 2017-07-26
  • 1970-01-01
  • 1970-01-01
  • 2018-12-13
  • 2014-12-03
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多