重载 istream 运算符

Overloading istream operator

我有一个字符串 class。我想重载运算符>>。找到了以下方式,但据我了解,末尾没有添加零字符(行终止符)。我怎样才能写出好的运算符 >>?

class String {
 public:
  char* str;
  size_t size;
  size_t capacity;

  ~String();
  String(const char*);
  friend std::istream& operator>>(std::istream&, String&);
};

std::istream& operator>>(std::istream& is, String& obj) {
      is.read(obj.str, obj.size);
      return is;
    }

让我们从显而易见的部分开始:您的 operator>> 需要根据您读取的输入实际创建一个有效的 String 对象。假设您要读取整行输入作为字符串(停在换行符或某个最大字符数处)。

目前,我假设任何 Stringstr 成员是一个空指针,或者是指向已分配给 new 的数据的指针.

std::istream &operator>>(std::istream &is, String &obj) { 
    static char buffer[max_size];

    is.getline(buffer, max_size);
    std::size_t size = std::strlen(buffer);
    if (size > 0) {
        if (size > obj.size) {
            delete [] obj.str;
            obj.str = new char [size+1];
            obj.capacity = size;
        }
        strcpy(obj.str, buffer);
        obj.size = size;
    }
    return is;
}

这并不是为了处理每一个极端情况(例如,它没有错误处理),但至少给出了一些总体思路——你需要阅读正文,检查你是否有足够 space 来存储文本,如果需要分配更多,将文本复制到(现有或新分配的)space,并至少将大小更新为当前大小,如果重新分配,则容量也更新为容量。