将对象数组传递给成员函数

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的成员函数,但是它突然中止了。我已经多次检查我的代码以确保计数器没有累积超过数组长度。因此,我认为对象数组作为参数肯定有问题,但我想不通。我的代码怎么了??

  1. 定义单元Class的构造函数和析构函数。
  2. 创建对象数组:Unit *array[len]。
  3. 现在您需要使用 new 运算符实例化对象。 例如。 array[1] = new Unit();
  4. 当您使用对象指针时,您需要使用箭头 (->) 运算符来调用函数而不是点 (.) 运算符。
  5. 现在,当您从同一成员函数的其他成员函数调用成员函数时,class您不需要创建对象来调用该方法。
  6. 还有一点,之前有其他人提到过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);
   }
}

像这样跳出循环。这是我熟悉递归函数的实践。感谢大家。