2011-05-19 82 views
0

我想知道爲什麼下面的代碼只返回「測試」四次而不是五次?關於Bool在C++中的問題

#include <iostream> 
    #include <cassert> 
    using namespace std; 

    class CountDown 
    { 
     public: //Application Programmer Interface 
     CountDown(int start); // it is set to start 
     void next(); // subtracts one from it 
     bool end()const; // 
    private: 
     int it; 
    }; 

    CountDown::CountDown(int start) 
    { 
     it = 0; 
     it = start; 
    } 

    void CountDown::next() 
    { 
     it = it - 1; 
    } 

    bool CountDown::end() const 
    { 
     if (it <= 0) 
      cout << "The countdown is now over" << endl; 
    } 

    int main() 
    { 
     for(CountDown i = 5 ; ! i.end(); i.next()) 
     std::cerr << "test\n"; 
    } 
+2

您是否缺少''end'方法中的'return'? – sje397 2011-05-19 05:57:17

+0

你能發佈'end'方法的正確定義嗎? – Naveen 2011-05-19 05:57:56

+1

我也有點困惑,'CountDown i = 5'這句話不應該起作用。不應該是'CountDown * i = new CountDown(5)'或者'CountDown i(5)' – 2011-05-19 06:21:46

回答

4

有在做這個雙初始化沒有一點:

CountDown::CountDown(int start) 
{ 
    it = 0; 
    it = start; 
} 

這是不夠的:

CountDown::CountDown(int start) 
{ 
    it = start; 
} 

甚至這一點,使用初始化列表:

CountDown::CountDown(int start):it(start) 
{ 
} 

至於結束()你不'從它返回任何值。該方法應該看起來像這樣:

bool CountDown::end() const 
{ 
    return it <= 0; 
} 
+0

更改end()函數使其僅輸出「test」一次... – mikhailovich 2011-05-19 06:12:08

+1

真的嗎?因爲當我測試它時,它會打印測試5次 – 2011-05-19 06:21:36

+0

這是另一個錯誤,對不起,你是對的。 – mikhailovich 2011-05-19 06:30:59

0

試試這個。

bool CountDown::end() const 
    { 
    if (it > 1) return false; 
    return true; 
    } 
+0

不必要的混淆:'it> 1'具有'bool'類型,可以直接輸出(或否定,但我寧願反轉測試:'it <= 0')。當然,價值是錯誤的,正如你寫的那樣,它應該是'it> 0'。 – 2011-05-19 07:50:38