这是一个基本程序,可以将两个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循环中声明?我如何在全球范围内访问它们?
答案 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)
调用重载运算符,该运算符在布尔上下文中计算流。这将检查流的状态以查看先前的操作是否已失败 - 如果是,则不能依赖整数变量i
中的值有效,因为流上的输入不是整数。
变量obj1
和obj2
在while循环的范围内定义 - 它们在范围之外不可用。你可以在while的范围之外声明它们,在这种情况下变量将保存它在while循环中保存的最后一个值。