【问题标题】:Exception handling classes in C++C++ 中的异常处理类
【发布时间】:2014-06-04 00:40:34
【问题描述】:

我的 OOP 课程有一项任务是创建一个基本的计算器。作业的目标是练习命名空间和异常处理。

为了清楚起见,我将粘贴问题的文本:

您必须实现 Kalkulator 类,它可以解决基本的数学表达式并将结果作为整数返回。

Kalkulator 类应该放在名为 Matematika 的命名空间中。整个类需要在没有.cpp文件的头文件中实现。

你必须定义两个异常并在正确的情况下抛出它们(它们在主函数中被捕获)

  • IncorrectDataExc 将类放入命名空间 Matematika->Exceptions
  • InvalidOperationExc 将类放入命名空间 Matematika->Exceptions

他们还给了我主要功能:

#include <iostream> 
#include <string> 
#include "Kalkulator.h" 
#include "IncorrectDataExc.h" 
#include "InvalidOperationExc.h" 

using namespace std; 

int main() 
{ 
    string s; 
    getline(cin, s); 

    try 
    {
        Matematika::Kalkulator kalkulator;
        cout << kalkulator.izracunaj(s) << endl;
    } 
    catch(Matematika::Exceptions::IncorrectDataExc) 
    { 
        cout << "Exception IncorrectData" << endl;
    } 
    catch(Matematika::Exceptions::InvalidOperationExc) 
    { 
        cout << "Exception InvalidOperation" << endl;
    } 

    return 0; 
}

我遇到的问题是,当我遇到异常时我不知道要抛出什么,并且我不知道 InvalidOperationExc 和 IncorrectDataExc 类应该是什么样子,因为我不知道 catch 函数是什么实际捕捉(一个物体?)

我必须创建 3 个头文件:

IncorrectDataExc.h
InvalidOperationExc.h 
Kalkulator.h

这是我目前所拥有的

#pragma once
#include <string>
#include <sstream>


using namespace std;

namespace Matematika{

class Kalkulator{
private:


public:
    int izracunaj(string mojString)
    {
        int prviBroj = 0;
        int drugiBroj = 0;
        char operacija = ' ';
        stringstream ss(mojString);
        ss >> prviBroj >> operacija >> drugiBroj;
        if(operacija != '*' && operacija != '+' && operacija != '/' && operacija != '-')
        {
            Matematika::Exceptions::InvalidOperationExc greska1;
            throw greska1;
        }
        if(prviBroj % drugiBroj != 0)
        {
            Matematika::Exceptions::IncorrectDataExc greska2;
            throw greska2;
        }
    }
};
}

我遇到了一些错误:

'Exceptions': the symbol to the left of a '::' must be a type
'InvalidOperationExc' : is not a member of 'Matematika'
'InvalidOperationExc' : undeclared identifier
 missing ';' before identifier 'greska1'
'greska1' : undeclared identifier
'greska1' : undeclared identifier

我不知道我做错了什么。最让我困惑的部分是这个

    catch(Matematika::Exceptions::IncorrectDataExc) 

catch 函数接收什么?

【问题讨论】:

    标签: c++ exception exception-handling namespaces


    【解决方案1】:

    相当不言自明的错误:

    'InvalidOperationExc' : 不是 'Matematika' 的成员

    换句话说,它不存在。这个

     Matematika::Exceptions::InvalidOperationExc greska1;
    

    导致错误。您应该将InvalidOperationExc 更改为其他内容或在Matematika 中创建它。

    【讨论】:

    • 我创建了一个名为 InvalidOperationExc.h 的头文件,在里面我写了 namespace Matematika{ namespace Exceptions{ class InvalidOperationExc{}; } }
    【解决方案2】:

    int izrakunaj() 不需要 Matematika::... 来访问命名空间 Matematika 的成员,因为它也是成员。

    namespace ns
    {
        int integer; //ns::integer
        void set0(){integer=0;} //modifies the variable above
        void set1(){ns::integer=1;} //modifies the variable below
    
        namespace ns
        {
            int integer; //ns::ns::integer
        }
    
    }
    

    【讨论】:

    • 我在代码中修复了这个问题,但仍然遇到同样的错误。
    • @nixpix 带有 izrakunaj() 的文件没有 #include 包含异常的标头,因此该文件不存在它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多