我正在制作一个带有填充对象的全局向量的程序,并将其放在命名空间中,这是代码:
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。
如果存在此异常的处理程序,则可以安全地继续该程序。
感谢您的时间
答案 0 :(得分:0)
std::vector <Character> characters;
这是 Characters 的容器。不是玩家。
chr::personajes.push_back(chr::player_one);
这将带你的玩家并从中创建一个新角色以放入向量。玩家在角色之上的所有信息都将丢失,您很容易出现名为slicing的内容。我会猜测并说这不是你想要的。
有多种方法可以解决这个问题。从没有容器的字符开始,但是一个字符引用的容器(在这里使用简单的英语意义,而不是C ++引用)。您可能希望查看智能指针(即std::shared_ptr<>
),以便尽可能轻松。