【问题标题】:Pass object array into member function将对象数组传递给成员函数
【发布时间】:2017-03-25 19:02:24
【问题描述】:

这是类定义:

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

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

【问题讨论】:

  • 你似乎有无限递归,因为modify_array 调用modify_array

标签: c++ arrays member-functions


【解决方案1】:

你有不受控制的递归。

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 &lt; 0 将导致不再调用。这对你有什么好处,我不能说,但它会停止递归。

你需要递归吗?我不知道。

【讨论】:

    【解决方案2】:
    1. 定义单元类的构造函数和析构函数。
    2. 创建对象数组:单位 *array[len]。
    3. 现在您需要使用 new 运算符来实例化对象。 例如。数组[1] = new Unit();
    4. 当您使用对象指针时,您需要使用箭头 (->) 运算符而不是点 (.) 运算符来调用函数。
    5. 现在,当您从同一类的其他成员函数调用成员函数时,您无需创建对象即可调用该方法。
    6. 还有一点,前面一些其他人员modify_array自己提到的,它是一个无限递归。

    【讨论】:

      【解决方案3】:

      感谢 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);
         }
      }
      

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

      【讨论】:

        猜你喜欢
        • 2013-12-26
        • 1970-01-01
        • 1970-01-01
        • 2019-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-22
        相关资源
        最近更新 更多