(C ++ Query)全局访问实例化对象

时间:2009-04-20 08:23:53

标签: c++ global

这是一个基本程序,可以将两个5位数字作为字符串,并使用“+”上的运算符重载在2个数字上使用加法。

#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)&amp; (ii)在上述代码中......

(1)(i)实际上做了什么?

(2)(ii) - &gt;不编译..因为错误“obj1未声明(首先使用此函数)”出现。这是因为obj1&amp; obj2只在while循环中声明?我如何在全球范围内访问它们?

3 个答案:

答案 0 :(得分:1)

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

  

布尔运营商! ()const;评估   流对象

     

如果其中任何一个,则返回true   错误标志(failbit或badbit)已设置   在流上。否则它会返回   假的。

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

  

failbit通常由输入设置   错误相关时的操作   与内部逻辑   操作本身,而badbit是   通常在错误涉及时设置   流的完整性丧失,   这可能会持续,即使一个   执行不同的操作   流。

2)这两个对象不在范围内,它们只存在于前面的括号中。

答案 1 :(得分: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();
    }
因此,它是本地的else-block&amp;不能在它外面访问。如果要增加其范围,请在块之外修改其定义。然而,将它移到所有块之外(即使其成为全局)并不是一个好主意。

答案 2 :(得分:0)

  1. 调用重载运算符,该运算符在布尔上下文中计算流。这将检查流的状态以查看先前的操作是否已失败 - 如果是,则不能依赖整数变量i中的值有效,因为流上的输入不是整数。

  2. 变量obj1obj2在while循环的范围内定义 - 它们在范围之外不可用。你可以在while的范围之外声明它们,在这种情况下变量将保存它在while循环中保存的最后一个值。