2017-03-25 29 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); 
    } 
} 

像這樣跳出循環。這是我熟悉遞歸函數的練習。感謝大家。