【问题标题】:Creating a class to throw in case of error创建一个在发生错误时抛出的类
【发布时间】:2018-04-02 18:29:13
【问题描述】:

我创建了自己的向量类,其行为有点像通常的 std::vector (我需要为这个作业这样做)。现在我想确保如果有人试图在这个向量类中写入超出它可以访问的内存范围的东西,它会给出一个错误并终止程序。

我的尝试:

template<typename T>
class vector
{
    private:
        T *elements;
        int sz;

    public:
        // vector functions etc. //
        struct out_of_range
        {
            string s;
            out_of_range(string b) : s{b} {cerr << "error: " << s << endl;}
        };
};

所以现在在可能遇到超出范围错误的向量成员函数中,我抛出了这个类。例如,在我的 [] 运算符重载中,我有这样的检查:

if(i < 0 || sz <= i) throw out_of_range("index out of range");

现在可以了,并通过以下消息终止程序:

错误:索引超出范围 在抛出 'vector::out_of_range' 的实例后调用终止 中止(核心转储)

我的问题是这是否是正确的方法。我是否可以从我拥有的函数中进行 cerr,我可以简单地抛出这个函数而不捕获它吗?据我所知,投掷而不捕获调用终止()对吗?这是不好的编码习惯吗?

我希望我没有让你们感到困惑,我的问题在某种程度上是可以理解的。提前感谢您的帮助:)

编辑:对不起,我应该提到,除了一些基本的类,如 std::string 和基本的输入和输出之外,我不允许使用我自己创建的任何类。

【问题讨论】:

  • 重用std::out_of_range怎么样?或者使用/继承其他标准异常类之一(记录在in e.g. this reference)?
  • 我想这里的重点不是重用(因为应该重用整个向量组件)而是学习写数据结构。
  • @Doleron 你是绝对正确的,我已经编辑了帖子,因为我忘记指定了。我需要创建自己的类来使用,并且只能使用 std::string 和 std::cout/cerr/cin。
  • 好吧,如果您不能使用标准异常类,那么如何将它们用于reference?检查它们的工作原理,使用它们时会发生什么等。然后在您自己的异常类中模拟该接口和行为。
  • 您是否碰巧知道解释它们如何工作的资源?我很难找到一个将代码裸露并解释为什么东西会做它的事情的网站。这让我很难理解。我对 c++ 比较陌生,所以如果你明白我的意思,我需要一些能详细解释事情的东西。

标签: class c++11 vector throw


【解决方案1】:

与 Java 不同,在 C++ 中,您可以在 throw 语句中使用非异常特定的元素。因此,您的结构适合用作抛出异常的表达式参数(就像 int 数字一样)。

但是,由于您使用 OOP 方法来编写程序,因此您还应该为您的异常应用类替代方案:

#include <iostream>
#include <exception>
using namespace std;

class myexception: public exception {

    virtual const char* what() const throw() {
        return "My exception happened";
    }
} myex;

int main () {

    try {
        throw myex;
    } catch (exception& e) {
        cout << e.what() << '\n';
    }
    return 0;
}

取自here

第一印象是这两种选择是等价的。基于类相对于基于结构的好处是,通过类,您可以提取面向对象方法提供的重用、扩展、封装等好处,这在编程更复杂、庞大和长寿命的系统时可能很有价值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 2014-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多