2013-06-22 44 views
1

我正在使用SDL的RTS游戏。我有一个woodyard类,其目的是从附近的树木收集木材。在课堂上,我创建矢量称为temp_trees并作为构造函数的参数我用我通过在树对象的矢量C++把一个载体元素拖到另一个载体上

备料构造:

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

你通过调试运行呢?调试器停止在哪里?它给了你什么错误? – kfsone

+0

它停在 “temp_trees [collect_control] .drewno - = 1;” – user2466076

+0

哪里是'temp_trees'宣布,WRT的'collect_wood'方法? – Massa

回答

0

构造不包含任何非法操作。

而且collect_wood(),虽然难以理解,不包含使其崩溃任何明显的原因。

这是collect_control价值?你检查是否是< temp_trees.size()?意识到temp_trees.size()不断变化,因为你正在擦除元素。

可能collect_control在擦除后不应该增加:所有元素都会移回,擦除后的collect_control已经指向下一个元素。

注:考虑到temp_trees.erase(temp_trees.begin());是最没有效率的事情,你可以用向量(删除第一个元素)做一个。

+0

我没有检查temp_trees大小的原因是它正在改变。 collect_control值决定了Tree对象的使用顺序。它在开始时设置为0,每当当前Tree对象用完并销毁时就增加。这使得该函数以矢量中的FIRST树开始,并在时间到来时删除FIRST树 – user2466076

+0

@ user2466076如果collect_control Antonio

+0

仍然工作 – user2466076

0

在备料构造函数时,宣布一个临时的,功能范围的变量“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()); 

,或者如果你使用视觉工作室可以做

if(collect_control >= temp_trees.size()) 
    DebugBreak(); 

“尺寸()”是一个基于1值,但数组索引操作符是基于零。这意味着,当矢量中有一个条目时,它将是矢量[0]。如果矢量为空,矢量[0]是非法的 - 它不存在。和空虚是由大小为0的大小必须始终比你正在试图访问的元素索引更大的表示。

+0

我的错误temp_trees向量声明在标头 – user2466076

+0

然后问题是它是空的。 size()== 0表示空,所以你不能访问temp_trees [0],因为没有元素。 (请参阅编辑答案的最后一段) – kfsone

+0

我应该在'temp_trees [...]。drewno = -1'之前使用断言 – user2466076

相关问题