因为我不允许使用std :: string作为赋值,所以我使用名为CharString的Custom类作为我自己无法初始化的情况的包装器。
该课程如下:
struct CharString {
char* str;
CharString() : str() {} // Initialize NULL
~CharString() { free(str); }
// Conversions to be usable with C functions
operator char**() { return &str; }
operator char*() { return str; }
};
但是,当我想使用>>时,我会收到以下错误在它上面。
binary '>>': no operator found which takes a right-hand operand of type 'utils::CharString' (or there is no acceptable conversion).
如何重载运算符>>
?
CharString operator>>(std::istream& is) {
is >> str;
return *this;
};
我尝试了以上但仍然给了我同样的错误。
答案 0 :(得分:1)
重载流提取操作符的一般方法是使用以下常规形式提供友元函数:
istream& operator>> (istream& in, MyObjectType& object) {
// read all the data you need to construct an object.
//
// Then:
if (in) { // Read succeeded! Update object.
// Build a new object of the appropriate type.
MyObjectType theOneIRead(basedOnTheDataIRead);
// Swap the object you were given as input for the one you
// just read. This way, if the read completely succeeds, you
// update the rhs, and if the read failed, nothing happens.
std::swap(object, theOneIRead);
}
return in;
}
请注意,此功能的签名将与您撰写的签名不同。
您需要处理与从流中一次读取一个字符相关联的逻辑,并构建某种临时缓冲区来保存它们。这不是一件轻而易举的事,也是我们有一个std::string
类型与库打包在一起的原因之一。但除此之外,按照下面的模板应该给你你想要的东西。
独立 - 您的struct当前有一个析构函数,但没有复制构造函数,移动构造函数或赋值运算符。通常,您还希望在析构函数旁边实现这些函数,因为否则复制对象将最终执行指针的浅表复制,并在两个独立对象尝试释放相同指针时导致内存问题。
此外,由于这是C ++,请考虑使用new[]
和delete[]
而不是malloc
和free
。