我正在使用SDL进行RTS游戏。我有一个木头类,其对象将收集附近树木的木材。在类中我创建了一个名为temp_trees的向量,并且作为构造函数的参数,我使用了传入的树对象向量。
木场建造者:
woodyard::woodyard(int x, int y, int HP, int id, vector<Tree> trees)
{
...
vector<Tree> temp_trees;
for(int i = 0; i < trees.size(); i++)
{
if((trees[i].xPos - 100) / 50 >= x - 5 && (trees[i].xPos - 100) / 50 <= x + 4)
{
if((trees[i].yPos - 100) / 50 >= y - 5 && (trees[i].yPos - 100) / 50 <= y + 4)
{
temp_trees.push_back(trees[i]);
}
}
}
collect_control = 0;
no = 0;
}
collect_wood函数:
void woodyard::collect_wood(){
if(no == 5)
{
temp_trees[collect_control].drewno -= 1;
if(temp_trees[collect_control].drewno <= 0){
collect_control++;
temp_trees.erase(temp_trees.begin());
}}
no++;
if(no >= 10){
no = 0;
}}
程序在启动后崩溃。 任何人都可以在此代码中看到任何错误吗?
PS:我认为在构造函数中将元素从一个向量加到另一个向量可能有问题。
答案 0 :(得分:0)
构造函数不包含任何非法操作。
而collect_wood()虽然难以理解,却没有明显的理由使其崩溃。
collect_control
的价值是多少?你检查它是< temp_trees.size()
吗?意识到temp_trees.size()
因为你正在删除元素而不断变化。
擦除后可能不会递增collect_control
:所有元素都会向后移位,并且擦除后的collect_control已经指向下一个元素。
注意:考虑temp_trees.erase(temp_trees.begin());
是使用向量可以做的最低效的事情之一(删除第一个元素)。
答案 1 :(得分:0)
在woodyard构造函数中,您声明了一个临时的,函数范围的变量“temp_trees”。
woodyard::woodyard(int x, int y, int HP, int id, vector<Tree> trees)
{
...
vector<Tree> temp_trees;
如果你有一个名为temp_trees的向量成员,则此声明将隐藏它。所以你的成员函数没有看到相同的向量:
void woodyard::collect_wood(){
if(no == 5)
{
temp_trees[collect_control].drewno -= 1;
另外,在没有看到其余代码的情况下,我不知道你是如何确保向量中至少有“collect_control”成员。
#include <assert.h>
...
assert(collect_control < temp_trees.size());
或者如果你正在使用visual studio,你可以
if(collect_control >= temp_trees.size())
DebugBreak();
“size()”是一个基于1的值,但数组索引运算符是基于零的。这意味着,当向量中有一个条目时,它将是向量[0]。如果向量为空,vector [0]是非法的 - 它不存在。并且空白用大小为0表示。大小必须始终大于您尝试访问的元素索引。