重写String类中的下标运算符

Overriding the subscript operator in String class

本文关键字:下标 运算符 String 重写      更新时间:2023-10-16

我正在用C++构建一个字符串类。目前,我正在尝试覆盖下标运算符,以便用户可以获取和修改单个字符。

#ifndef STRING_HPP
#define STRING_HPP
#include "test.hpp"
#include <cstring>
#include <iosfwd>

struct String
{
  // Defines the npos value.
  static constexpr std::size_t npos = -1;
  int len;
  char *str;
  String()
  :len(0), str(0){}
  String(char const * S)
  :len(strlen(S)), str(new char[len + 1]){
    assert(S != 0);
    strcpy(str, S);
  }
  ~String(){
    delete[]str;
  }
  String (char *S, std::size_t const n)
  :len(n), str(new char[len + 1]){
    assert(S != 0);
    assert(strlen(S) >= n);
    strncpy(str, S, n);
    str += '';
  }

  String operator +=(String const &S){
    int n = len + S.len;
    char * p = new char[n+1];
    strcpy(p + len, S.str);
    len = n;
    str = p;
    return *this;
  }
  char* data() const {
    return this->str;
  }
  bool empty() const {
    return (this->len == 0);
  }
  size_t size()const {
    size_t temp = len;
    return temp;
  }
  //assignment operator
  String operator =(String const &s){
    String temp(s);
    swap(temp);
    return *this;
  }
  void swap(String &s){
    std::swap(len, s.len);
    std::swap(str, s.str);
  }
  size_t find(const char c){
    char * p = strchr(this->str, c);
    if(p){
      return (str - p);
    }else{
       return npos;
    }
  }
  char &operator[](const size_t pos){
    assert(pos >= 0);
    assert(pos < this->size());
    return str[pos];
 //return output;
  }
  String substr(int index, int dist){
    String output((this->str + index) ,dist);
    return output;
  }
};

// Output
std::ostream& operator<<(std::ostream&, String const&);
//String operator +=(String const &);
bool operator <(String const &, String const &);
bool operator >(String const &, String const &);
bool operator <=(String const &, String const &);
bool operator >=(String const &, String const &);
bool operator ==(String const &, String const &);
#endif

main中调用下标函数的部分是:

String s1 = "String";
s1[0] = 'a';

我得到的错误是:

error: passing 'const String' as 'this' argument of 'char& String::operator[](size_t)' discards qualifiers [-fpermissive]

谢谢!

编辑

更新的错误消息是正确的

发现答案只是在函数末尾添加一个"const":

  char &operator[](const size_t pos)const{
    assert(pos >= 0);
    assert(pos < this->size());
    return str[pos];
 //return output;
  }