访问字符串类与运算符[]

问题描述:

对于培训,我想写一个类像std :: string。 我读过(int)的方法返回对字符的引用,并在索引错误(过长或负值)的情况下抛出异常。 运算符[]不会抛出任何异常。 但是,由于它返回一个引用,如果索引太长,它会返回什么? 这是I类有:访问字符串类与运算符[]

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; 
} 

我要让运营商[],我也可以把它抛出一个异常,但问题是,我不知道它应该在的情况下返回该指数太长。 例如运营商[]重载是这样的:

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

你为什么要捕捉'operator []'里面的异常?让它逃到用户面前,让他们抓住它;在同一个地方投掷和捕捉没有任何用处。 – ildjarn 2012-02-17 23:19:45

+0

未定义的行为 – PlasmaHH 2012-02-17 23:22:41

如果要在同一个块中捕获异常,抛出异常没有多大意义。只要你的if声明控制了事情,如果你想返回的东西,而不是把错误抛出你的函数。

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

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

+0

我可以返回零,但它返回一个引用。所以我应该怎么做,分配一个新的字符并将其设置为零? – 2012-02-17 23:25:05

+0

如果您需要边界检查,只需抛出异常。 – rasmus 2012-02-17 23:27:29

+0

@Ramy:返回一个哨兵char'(而不是'char const')并不是真的可行。国际海事组织你最好走UB或例外路线。 – ildjarn 2012-02-17 23:28:28