重载 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
对象。假设您要读取整行输入作为字符串(停在换行符或某个最大字符数处)。
目前,我假设任何 String
的 str
成员是一个空指针,或者是指向已分配给 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,并至少将大小更新为当前大小,如果重新分配,则容量也更新为容量。
我有一个字符串 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
对象。假设您要读取整行输入作为字符串(停在换行符或某个最大字符数处)。
目前,我假设任何 String
的 str
成员是一个空指针,或者是指向已分配给 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,并至少将大小更新为当前大小,如果重新分配,则容量也更新为容量。