【发布时间】:2012-03-09 08:35:39
【问题描述】:
对于培训,我正在尝试编写一个类似 std::string 的类。 我已经读过 at(int) 方法返回对字符的引用,并在索引错误(太长或负数)的情况下引发异常。 operator[] 相反不会抛出任何异常。 但是既然它返回一个引用,那么如果索引太长,它返回什么? 这是我的课程:
class string
{
public:
static const unsigned int length_max=100;
string(const char* field=NULL)
{
if(field!=NULL)
{
const unsigned int length=strlen(field);
this->field=new char[length+1];
this->length=length;
for(unsigned int i=0;i<=length;i++)
this->field[i]=field[i];
}
else
{
this->field=NULL;
length=0;
}
}
string& operator=(const char* field)
{
const unsigned int length=strlen(field);
if(this->field!=NULL)
delete this->field;
this->field=new char[length];
this->length=length;
for(unsigned int i=0;i<length;i++)
this->field[i]=field[i];
return *this;
}
string& operator= (const string& str)
{
*this=str.field;
return *this;
}
operator char* ()
{
return field;
}
friend std::ostream& operator<< (std::ostream& out, string& str);
friend std::istream& operator>> (std::istream& in, string& str);
private:
char* field;
unsigned int length;
};
std::ostream& operator<<(std::ostream& out, string& str)
{
out << str.field;
return out;
}
std::istream& operator>> (std::istream& in, string& str)
{
char temp[string::length_max];
in >> temp;
str=temp;
return in;
}
我想让operator[],我也可以让它抛出异常,但问题是我不知道在索引太长的情况下它会返回什么。 例如 operator[] 重载是这样的:
char& operator[] (int i)
{
try
{
if(i<0 || i>=length)
throw indexException();
return field[i];
}
catch(indexException& e)
{
std::cerr << e.what() << std::endl;
}
}
这是个例外:
class indexException:std::exception
{
public:
virtual const char* what()
{
return "Index is either too long, or negative";
}
};
它必须返回一个 char 引用,而不仅仅是一个 char,因为我想让它可赋值,例如,如果我有一个字符串 str,我可以说 str[5]='c'。 我也想处理异常,而不是用 exit() 退出程序。 因此,如果出现异常,它不返回任何值,则字符串也可能为空。 我应该返回什么?我会让它类似于 std::string 但我不太了解 std::string 是如何实现的。
【问题讨论】:
-
你为什么在
operator[]中捕获异常?让它逃给用户,让他们抓住它;在同一个地方扔和接是没有用的。
标签: c++ stl exception-handling stdstring