使用operator []访问字符串类

时间:2012-02-17 23:18:04

标签: c++ stl exception-handling stdstring

对于训练,我正在尝试编写类似std :: string的类。 我已经读过(int)方法返回对字符的引用,并在索引错误(太长或负)的情况下抛出异常。 而[]运算符[]不会抛出任何异常。 但是因为它返回一个引用,如果索引太长,它返回什么? 这是我的课程:

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是如何实现的。

1 个答案:

答案 0 :(得分:2)

如果要在同一个区块内捕获异常,则抛出异常并不重要。如果您希望返回一些内容而不是将错误抛出函数之外,请让if语句控制内容。

标准字符串类不会对其索引进行任何检查,因此不会增加额外开销。如果索引超出范围,则会得到未定义的行为,因为您在内部缓冲区上使用了一个越界索引。

您可以为越界索引选择要返回的内容。零将是一个不错的选择,因为这将表明C风格字符串的结束。