我试图在MinGW中编写这个简单的代码,但每当我尝试将x设置为负数时,它会显示消息"超出系统范围!!"它应该显示" x低于0"。我只是不明白为什么它一直只显示那条消息......
#include <iostream>
#define Max 80
#define Min 20
using namespace std;
class Punct
{
protected:
int x,y;
public:
class xZero{};
class xOutOfSystemBounds{};
Punct (unsigned a, unsigned b)
{
x=a;
y=b;
}
unsigned Getx()
{
return x;
}
unsigned Gety()
{
return y;
}
void Setx( unsigned a )
{
if( a<0 )
throw xZero();
else
if(( a>Max || a<Min ) && a>0 )
throw xOutOfSystemBounds();
else
x=a;
}
void Sety( unsigned a )
{
if( a<0 )
throw xZero();
else
if( a>Max || a<Min )
throw xOutOfSystemBounds();
else
y=a;
}
};
int main()
{
Punct w(4,29);
try
{
w.Setx(-2);
cout<<"noul x:>"<<w.Getx()<<'\n';
}
catch( Punct::xZero )
{
cout<<"x is lower than 0"<<'\n';
}
catch( Punct::xOutOfSystemBounds )
{
cout<<"out of system bounds!!"<<'\n';
}
catch( ... )
{
cout<<"Expresie necunoscuta!"<<'\n';
}
system("PAUSE");
return 0;
}
答案 0 :(得分:1)
void Setx( unsigned a )
将参数视为unsigned int
。当您发送(已签名)否定号码时,它会转换为unsigned int
,并成为一个大的正数(&gt; Max
)。因此抛出xOutOfSystemBounds
异常,而不是xZero
。你必须改变
void Setx( int a ){ ...}
答案 1 :(得分:1)
那是因为你在你的setter参数中使用unsigned
,根据定义,它没有负值。将其更改为int
,它应该按预期运行。