2017-10-21 98 views
0

我创建了自己的向量类,其行为有点像通常的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"); 

现在这个工程,并与下面的消息终止程序:

error: index is out of range terminate called after throwing an instance of 'vector::out_of_range' Aborted (core dumped)

我的问题是,如果这是正确的做法。我是否允许使用像我这样的函数,并且可以简单地抛出这个函数而不捕获它?据我所知,抛出没有捕获电话terminate()正确吗?这是不好的编码习惯?

我希望我没有混淆你们,我的问题有点可以理解。感谢您的任何帮助提前:)

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

+1

如何重用['std :: out_of_range'](http://en.cppreference.com/w/cpp/error/out_of_range)?或者使用/继承其他标准异常类之一([例如,在此参考文献中](http://en.cppreference.com/w/cpp/error))? –

+0

我想这里的重点不是重用(因为这样整个向量组件应该被重用),而是了解写入数据结构。 – Doleron

+0

@Doleron你是绝对正确的,我已经编辑了这篇文章,因为我忘了指定。我需要创建自己的类来使用,只能使用std :: string和std :: cout/cerr/cin。 – JuliusAF

回答

0

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

然而,由于您使用的是面向对象的方法来编写程序,你应该也适用于一类替代你的例外:

#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服用。

第一印象是两种替代方案都是相同的。基于结构的类的好处在于,通过类可以提取面向对象方法提供的重用,扩展,封装等优点,这在编程更复杂,更庞大,更长寿的系统时非常有用。