将对象数组传递给成员函数
Pass object array into member function
这里是 class 定义:
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;
}
我将一个对象数组作为参数传递给class的成员函数,但是它突然中止了。我已经多次检查我的代码以确保计数器没有累积超过数组长度。因此,我认为对象数组作为参数肯定有问题,但我想不通。我的代码怎么了??
- 定义单元Class的构造函数和析构函数。
- 创建对象数组:Unit *array[len]。
- 现在您需要使用 new 运算符实例化对象。
例如。 array[1] = new Unit();
- 当您使用对象指针时,您需要使用箭头 (->) 运算符来调用函数而不是点 (.) 运算符。
- 现在,当您从同一成员函数的其他成员函数调用成员函数时,class您不需要创建对象来调用该方法。
- 还有一点,之前有其他人提到过
modify_array
调用自身,是无限递归。
你有不受控制的递归。
在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
次...
你应该能看到这是怎么回事。
不幸的是,我不确定您的目标是什么,因此无法建议合适的解决方案,但您必须有一些退出条件才能在 运行 超出自动存储之前停止调用链(最有可能堆栈 space)。
例如你可以
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
将不会再调用。这对你有什么好处,我不能说,但它会停止递归。
你真的需要递归吗?我不知道。
感谢user4581301的帮助!我终于找到了我犯的错误。
我编写的代码是用随机起始索引修改整个数组,所以我尝试通过递归调用来完成。我忘了把终止条件放在我的递归函数中,这一定是最重要的部分。
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);
}
}
像这样跳出循环。这是我熟悉递归函数的实践。感谢大家。
这里是 class 定义:
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;
}
我将一个对象数组作为参数传递给class的成员函数,但是它突然中止了。我已经多次检查我的代码以确保计数器没有累积超过数组长度。因此,我认为对象数组作为参数肯定有问题,但我想不通。我的代码怎么了??
- 定义单元Class的构造函数和析构函数。
- 创建对象数组:Unit *array[len]。
- 现在您需要使用 new 运算符实例化对象。 例如。 array[1] = new Unit();
- 当您使用对象指针时,您需要使用箭头 (->) 运算符来调用函数而不是点 (.) 运算符。
- 现在,当您从同一成员函数的其他成员函数调用成员函数时,class您不需要创建对象来调用该方法。
- 还有一点,之前有其他人提到过
modify_array
调用自身,是无限递归。
你有不受控制的递归。
在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
次...
你应该能看到这是怎么回事。
不幸的是,我不确定您的目标是什么,因此无法建议合适的解决方案,但您必须有一些退出条件才能在 运行 超出自动存储之前停止调用链(最有可能堆栈 space)。
例如你可以
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
将不会再调用。这对你有什么好处,我不能说,但它会停止递归。
你真的需要递归吗?我不知道。
感谢user4581301的帮助!我终于找到了我犯的错误。 我编写的代码是用随机起始索引修改整个数组,所以我尝试通过递归调用来完成。我忘了把终止条件放在我的递归函数中,这一定是最重要的部分。
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);
}
}
像这样跳出循环。这是我熟悉递归函数的实践。感谢大家。