以下是课程定义:
class Unit
{
public:
Unit();
~Unit();
void set_unit(int a);
void modify_flag(Unit&);
void modify_array(Unit array[], int len); // ?? The problem
int show_unit();
private:
int ai;
};
成员函数的实现:
void Unit::set_unit(int a)
{
ai = a;
}
void Unit::modify_flag(Unit& u)
{
u.set_unit(20);
}
void Unit::modify_array(Unit array[], int len) // ?? The problem
{
for (int i = 0; i < len; ++i)
{
modify_flag(array[i]);
array[i].modify_array(array, len);
}
}
int Unit::show_unit()
{
return ai;
}
最后是主要代码:
int main(int argc, char const *argv[])
{
int len = 10;
Unit* array = new Unit[len];
for (int i = 0; i < len; ++i)
{
array[i].set_unit(0);
}
array[5].modify_array(array,len); // ?? The problem
for (int i = 0; i < len; ++i)
{
cout << array[i].show_unit() << endl;
}
delete [] array;
return 0;
}
我将一个对象数组作为参数传递给类的成员函数,但它突然中止了。我已经多次检查了我的代码,以确保计数器没有在数组长度上累积。因此,我认为对象数组一定有问题作为参数,但我无法弄明白。我的代码怎么了?
答案 0 :(得分:0)
modify_array
之前提到的另一点是自称,这是一个无限的递归。答案 1 :(得分:0)
你有不受控制的递归。
在modify_array
中,程序将调用
array[i].modify_array(array, len);
len
次,每次都会调用
array[i].modify_array(array, len);
len
次,每次都会调用
array[i].modify_array(array, len);
len
次,每次都会调用
array[i].modify_array(array, len);
len
次......
你应该能够看到它的发展方向。
不幸的是,我不确定您的目标是什么,因此无法提出正确的解决方案,但您必须有一些退出条件才能在用完自动存储之前停止呼叫链(大多数情况下)可能的堆栈空间)。
例如你可以
void Unit::modify_array(Unit array[], int len) // ?? The problem
{
for (int i = 0; i < len; ++i)
{
modify_flag(array[i]);
array[i].modify_array(array, len - 1); // note the -1
}
}
这样每次迭代都会查看较少的数组。最终len
将为0,i < 0
将导致无法进一步调用。我不能说这对你有什么好处,但它会阻止递归。
你需要递归吗?我不知道。
答案 2 :(得分:0)
感谢user4581301的帮助!我终于找到了我犯的错误。 我写的代码是用随机的起始索引修改整个数组,所以我尝试通过resursive调用来做。我忘记在我的递归函数中放置终止条件,这必须是最重要的部分。
void Unit::modify_array(Unit array[], int len)
{
for (int i = 0; i < len; ++i)
{
if(need_to_modify(array[i]))
array[i].modify_array(array, len);
}
}
像这样跳出循环。这是我熟悉递归函数的习惯。感谢大家。