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

时间:2017-03-25 19:02:24

标签: c++ arrays member-functions

以下是课程定义:

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;
}

我将一个对象数组作为参数传递给类的成员函数,但它突然中止了。我已经多次检查了我的代码,以确保计数器没有在数组长度上累积。因此,我认为对象数组一定有问题作为参数,但我无法弄明白。我的代码怎么了?

3 个答案:

答案 0 :(得分:0)

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

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