由于对象向量

时间:2016-07-31 19:29:59

标签: c++ vector crash sfml

我正在制作一个带有填充对象的全局向量的程序,并将其放在命名空间中,这是代码:

Character.h

#include <vector>
class Character
{
  //Constructor and variable declaration, etc.
}
class Player: public Character
{
  //Constructor and variable declaration, etc.
}
namespace chr
{
 extern std::vector<Character> characters;
 extern Player player_one;
}

Character.cpp

namespace chr
{
 Player player_one("name");
 std::vector <Character> characters;
}

#include <SFML/Graphics.hpp> //I'm using the SFML libraries
#include "Personaje.h"

 int main()
 {
 Player player_two("name"); //just to test that single object work (they do)
 chr::personajes.push_back(chr::player_one); //HERE'S THE ISSUE

  //sample SFML code to check if the rest of the program works
 sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!");
 sf::CircleShape shape(100.f);
 shape.setFillColor(sf::Color::Green);

 while (window.isOpen())
 {
    sf::Event event;
    while (window.pollEvent(event))
    {
        if (event.type == sf::Event::Closed)
            window.close();

    }

    window.clear();
    window.draw(shape);
    window.display();
 }

return 0;
}

当我构建这段代码(我正在使用code :: Blocks)时,它实际上编译时没有错误,但是当我运行它时,一旦控制台出现(SFML窗口甚至没有弹出)它就会冻结并出现Windows通知,通知我我的程序已停止工作。 我知道这是 chr命名空间上的代码导致这种情况,因为如果我将其注释掉,程序运行正常,但我不知道为什么会这样。 如果它有任何帮助,当程序崩溃Windows时会打开Visual Studio调试器,它会生成以下消息:

  

wtfhappened.exe中的0x0044EFA2抛出异常:0xC0000005:访问冲突读取位置0xFFFFFFFC。

     

如果存在此异常的处理程序,则可以安全地继续该程序。

感谢您的时间

1 个答案:

答案 0 :(得分:0)

std::vector <Character> characters;

这是 Characters 的容器。不是玩家。

chr::personajes.push_back(chr::player_one);

这将带你的玩家并从中创建一个新角色以放入向量。玩家在角色之上的所有信息都将丢失,您很容易出现名为slicing的内容。我会猜测并说这不是你想要的。

有多种方法可以解决这个问题。从没有容器的字符开始,但是一个字符引用的容器(在这里使用简单的英语意义,而不是C ++引用)。您可能希望查看智能指针(即std::shared_ptr<>),以便尽可能轻松。