2017-03-25 32 views
0

下面是类认定中:通行证对象数组成员函数

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

我将一个对象数组作为参数传入类的成员函数,但它突然中止。我已经多次检查过我的代码,以确保计数器不会累积超过数组长度。因此,我认为对象数组作为参数必定有问题,但我无法弄清楚。我的代码发生了什么?

+2

您似乎有无限递归,因为'modify_array'调用'modify_array'。 – aschepler

回答

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将不会导致进一步的呼叫。你有什么好处,我不能说,但它会停止递归。

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

0
  1. 定义单元类的构造函数&析构函数。
  2. 要创建对象数组:单位*阵列[长度]。
  3. 现在您需要使用new运算符来实例化对象。例如, array [1] = new Unit();
  4. 当你使用,你需要使用带箭头的对象指针( - >)运算符来调用函数,而不是点运算符(。)。
  5. 现在当你调用同一类的其他成员函数成员函数,你不需要创建和对象调用该方法。
  6. 还有一点这是由一些其他人员modify_array调用本身,它是一个无限递归前面提到的。
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); 
    } 
} 

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