【发布时间】: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++ 比较陌生,所以如果你明白我的意思,我需要一些能详细解释事情的东西。