尝试实现简单的 ostream 单例 class

trying to implement simple ostream singleton class

我想实现一个接收文件路径作为参数的单例 class。我试着写了下面的代码。我知道它不起作用而且不好,但我找不到原因..

class OutputData {
    std::fstream ofile;
    std::ostream iout;
    static OutputData *odata;
    OutputData(const char* path):iout(std::cout), ofile(path) {
        if (ofile.is_open()) {
            iout = ofile;
        }
    }
public:
    static void print(std::string s) {
        iout << s;
    }
};

在 .cpp 中

OutputData *OutputData::odata = nullptr;

从现在开始,我希望每个 class 都能够写入该流。

谢谢

你不能复制任何std::istreamstd::ostream实例,你的成员变量应该是引用或指针:

class OutputData {
    std::fstream* ofile;
    std::ostream* iout;
    static OutputData *odata;
    OutputData(const char* path):iout(nullptr), ofile(nullptr) {
        ofile = new fstream(path);
        if (ofile->is_open()) {
            iout = ofile;
        }
        else {
            delete ofile;
            ofile = nullptr;
            iout = &cout;
        }
    }
    // Take care to provide an appropriate destructor
    ~OutputData() {
        delete ofile;
    }

};

关于您的单例设计,我更愿意推荐 Scott Meyer 的单例成语:

class OutputData {
public:
    static OutputData& instance(const char* path) {
        static OutputData theInstance(path)
        return theInstance;
    }
    // Make print a non-static member function
    void print(std::string s) {
        iout << s;
    }
};

虽然这种方法看起来很奇怪,但恰恰相反,被认为是规范的解决方案。