如何在新类中运算符重载fstream?[复制]

How to operator overload fstream in a new class? [duplicate]

提问人:f1msch 提问时间:10/31/2023 更新时间:10/31/2023 访问量:59

问:

我想包装一个新类来生成一个文件,并对新文件进行一些自动资源回收和一些额外的操作。 所以我做了一个新类,比如

class TmpFile {
private:
    std::string tmp_file_name;
    std::ofstream tmp_file;

public:
    TmpFile(const std::string &name) :tmp_file_name(name),
                                       tmp_file(tmp_file_name, ios::out | ios::trunc) {}
    ~TmpFile() {
        tmp_file.close();
        //some operate afterwards using tmp_file
        ...
    }
};

但是有没有办法让运算符重载“<<”以写入“类 TmpFile”中的文件,例如

TmpFile f;
f << "asd";
C++ 运算符重载 fstream

评论

0赞 Joel 10/31/2023
void operator<<(const std::string& str) { }
0赞 molbdnilo 10/31/2023
您的操作方式与所有其他二进制运算符相同。请参阅运算符重载的基本规则和习惯用语是什么? 了解所有坚韧不拔的细节。
0赞 Alan Birtles 10/31/2023
查看 godbolt.org/z/7zc5c8TWr

答:

0赞 Austin Yang 10/31/2023 #1

如果只想接受一个带有“<<”运算符的对象,可以直接覆盖它:

class TmpFile {
private:
    std::string tmp_file_name;
    std::ofstream tmp_file;

public:
    TmpFile(const std::string &name) :tmp_file_name(name),
                                       tmp_file(tmp_file_name, ios::out | ios::trunc) {}
    ~TmpFile() {
        tmp_file.close();
        //some operate afterwards using tmp_file
        ...
    }

    // here define your operator
    void operator << (const std::string& str) {
        // do something
    }
};

如果你想接受多个对象,用一个运算符<<,你可以这样检查特征库是如何实现的,例如:

f << "asdf", "efsjkfl"