异常处理C ++错误

时间:2012-08-20 06:55:02

标签: c++ exception-handling

#include<iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;
class div
{
    int x,y;
public:
    class dividebyzero
    {
    };
    class noerror1
    {
    };
    div(){};
    div(int a,int b)
    {
        x=a;
        y=b;
    }
    void error1()
    {
        if(y==0)
            throw dividebyzero();
        else
            throw noerror1();
    }
    int divide()
    {
        return (x/y);
    }
};
class naming
{
    char name[32];
public:
    class nullexception
    {
    };
    class noerror2
    {
    };
    naming(char a[32])
    {
        strcpy(name,a);
    }
    void error2()
    {
        if(strcmp(name,"")==0)
            throw nullexception();
        else
            throw noerror2();
    }
    void print()
    {
        cout<<"Name-----"<<name<<endl;
    }
};
int main()
{
    div d(12,0);
    try
    {
        d.error1();
    }
    catch(div::dividebyzero)
    {
        cout<<"\nDivision by Zero-------Not Possible\n";
    }
    catch(div::noerror1)
    {
        cout<<"\nResult="<<d.divide()<<endl;
    }
    naming s("Pankaj");
    try
    {
        s.error2();
    }
    catch(naming::nullexception)
    {
        cout<<"\nNull Value in name\n";
    }
    catch(naming::noerror2)
    {
        s.print();
    } 
    return 0;
}

在编译此程序时,我收到以下错误

pllab55.cpp: In function ‘int main()’:
pllab55.cpp:61:6: error: expected ‘;’ before ‘d’
pllab55.cpp:64:3: error: ‘d’ was not declared in this scope
pllab55.cpp:72:22: error: ‘d’ was not declared in this scope
pllab55.cpp:74:20: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]

在声明类命名之前,一切运行正常。在声明命名之后,这些错误开始发生。我是C ++的新手。请详细解释我。提前谢谢。

5 个答案:

答案 0 :(得分:2)

标准命名空间中已经有 std::div ,因为您使用using namespace指令而不是声明它将std命名空间中的所有符号导入当前范围。因此,重命名div类可能会为您解决问题。

我尝试重命名它, work indeed

因此要么重命名你的类,要么将它包装在你自己的命名空间中,这样它就不会与std::div冲突

答案 1 :(得分:2)

您的类div与std :: div共享同一个名称。当您执行#using namespace std时,结果是std命名空间中的每个类都被导入到当前范围中,这意味着std :: div现在基本上称为div。如果你看到,这意味着你现在有两个在同一范围内称为div的类,你自己的和std类。

顺便说一下,你应该避免使用命名空间语法,而是使用类的完整限定符(例如std :: cout)。

答案 2 :(得分:0)

您的div类与std::div冲突,因此要么重命名您的,要么将您的div类放在不同的命名空间中。

namespace me {
   struct div{};
}

me::div d;

答案 3 :(得分:0)

我在gcc中尝试了你的代码(稍微变了一下),我收​​到了以下错误:

 /usr/include/stdlib.h:780: error: too few arguments to function 'div_t div(int, int)'

你正试图从标准库中覆盖一个名称,并且遇到类和具有相同名称的函数的冲突,我担心。

答案 4 :(得分:0)

作为一般经验法则,如果遇到此类问题,请尝试尽可能减少代码。例如,我把它减少到了

#include<stdlib.h>

class div {
public:
  div (int a, int b) { }
};

int
main () {
  div d (12, 0);
  return 0;
}

仍显示您的错误(至少第一个 - 其他是后续错误)。 这使您可以减少关于错误原因的可能假设 - 如您所见,您的新类“命名”不必对您看到的错误执行任何操作。 当我现在另外删除include时,错误不再显示,这让我怀疑某些命名与stdlib.h中的符号发生冲突。将“div”类重命名为其他东西(如“CDiv”)后,它就可以了。