2009-04-20 87 views
0

這是一個基本程序,用於獲取兩個5位數字作爲字符串,並在'+'上使用運算符重載在2個數字上使用加法。(C++查詢)全局訪問實例化的對象

#include <iostream> 
#include <limits> 
#include <cstdlib> 
#include <cstring> 
#include <sstream> 

using namespace std; 


class IntStr 
{ 
    int InputNum; 
    public: 
    //IntStr(); 
    IntStr::IntStr(int num); 
    IntStr operator+ (const IntStr &); 
    //~IntStr(); 
    void Display(); 
}; 

IntStr::IntStr(int num) 
{ 
    InputNum = num; 
} 

void IntStr::Display() 
{ 
    cout << "Number is (via Display) : " << InputNum <<endl; 
} 


IntStr IntStr::operator+ (const IntStr & second) { 
     int add_result = InputNum + second.InputNum; 
     return IntStr(add_result); 
     } 



int main() 
{ 
    string str; 
    bool option = true; 
    bool option2 = true; 
    while (option) 
    { 
    cout << "Enter the number : " ; 
    if (!getline(cin, str)) 
    { 
     cerr << "Something went seriously wrong...\n"; 
    } 

    istringstream iss(str); 
    int i; 
    iss >> i; // Extract an integer value from the stream that wraps str 

    if (!iss) 
    { 
     // Extraction failed (or a more serious problem like EOF reached) 
     cerr << "Enter a number dammit!\n"; 
    } 
    else if (i < 10000 || i > 99999) 
    { 
    cerr << "Out of range!\n"; 
    } 
    else 
    { 
     // Process i 
     //cout << "Stream is: " << iss << endl; //For debugging purposesc only 
     cout << "Number is : " << i << endl; 
     option = false; 
     IntStr obj1 = IntStr(i); 
     obj1.Display(); 
    } 
    }//while 


    while (option2) 
    { 
    cout << "Enter the second number : " ; 
    if (!getline(cin, str)) 
    { 
     cerr << "Something went seriously wrong...\n"; 
    } 

    istringstream iss(str); 
    int i; 
    iss >> i; // Extract an integer value from the stream that wraps str 

    if (!iss) //------------------------------------------> (i) 
    { 
     // Extraction failed (or a more serious problem like EOF reached) 
     cerr << "Enter a number dammit!\n"; 
    } 
    else if (i < 10000 || i > 99999) 
    { 
    cerr << "Out of range!\n"; 
    } 
    else 
    { 
     // Process i 
     //cout << "Stream is: " << iss << endl; //For debugging purposes only 
     cout << "Number is : " << i << endl; 
     option2 = false; 
     IntStr obj2 = IntStr(i); 
     obj2.Display(); 
     //obj1->Display(); 
    } 
    }//while 

    //IntStr Result = obj1 + obj2; // --------------------> (ii) 
    //Result.Display(); 

    cin.get(); 
} 

需要澄清的點(I)&(II)在上面的代碼...

(1)什麼是(我)其實做什麼? (2)(ii) - >不會編譯..因爲錯誤「obj1未聲明(首先使用此函數)」出現。這是因爲obj1 & obj2僅在while循環中聲明?我如何在全球範圍內訪問它們?

回答

0
if (!iss) 

測試如果流是在一個糟糕的狀態,這將是情況下,如果轉換失敗,或者如果你是在流的末尾

OBJ1這裏定義:

else 
    { 
     // Process i 
     //cout << "Stream is: " << iss << endl; //For debugging purposesc only 
     cout << "Number is : " << i << endl; 
     option = false; 
     IntStr obj1 = IntStr(i); 
     obj1.Display(); 
    } 

因此它是本地的其他塊&不能訪問它以外。如果你想增加它的範圍,請在塊的外面修改它的定義。但是,將它移到所有塊之外並不是一個好主意(即使它成爲全局塊)。

0
  1. 調用重載操作符來評估布爾上下文中的流。這將檢查流的狀態以查看以前的操作是否失敗 - 如果是,則不能依賴整數變量i中的值有效,因爲流中的輸入不是整數。

  2. 變量obj1obj2在while循環的範圍內定義 - 它們不在範圍之外。你可以將它們聲明在while範圍之外,在這種情況下,變量將保存它在while循環中保存的最後一個值。

1

1)從http://www.cplusplus.com/reference/iostream/ios/operatornot/

布爾運算符! ()const;如果 錯誤標誌(failbit或badbit)中的任一個被設定 流上的評價 流對象

返回true。否則,它將返回 false。

http://www.cplusplus.com/reference/iostream/ios/fail/

failbit通常由當誤差是與 操作本身的內部邏輯相關 輸入 操作來設定,而當錯誤涉及badbit是 通常設置 流的完整性丟失, 即使 不同操作在 流上執行,它也可能會持續存在。

2)這兩個對象不在範圍內,它們只存在於前面的括號中。

+0

哇,不知道操作符!()超載,謝謝! – 2009-04-20 08:41:08