【发布时间】:2016-07-31 19:29:58
【问题描述】:
我正在制作一个包含对象的全局向量并将其放入命名空间的程序,代码如下:
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。
如果有这个异常的处理程序,程序可以安全地继续。
感谢您的宝贵时间
【问题讨论】:
-
调试器的用途。如果你认为
//Constructor and variable declaration, etc.和Character和Player都与此无关,那么在我们看到该代码 之前我会有所不同。我的疯狂猜测是,您在这些课程中的一个或两个中都违反了Rule of Three。或object slicing 问题。或者两者兼而有之。顺便说一句,std::vector<Character> characters;与您的std::vector <Personaje> personajes;不匹配。 -
Code::Blocks 不是编译器,而是 IDE/编辑器 ...
-
什么? Windows自动打开VS调试器?全靠自己?再来一次?