运营商>>用于char指针包装器

时间:2017-10-28 19:32:00

标签: c++ string operator-overloading iostream

因为我不允许使用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;
};

我尝试了以上但仍然给了我同样的错误。

1 个答案:

答案 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[]而不是mallocfree