试图实现简单的ostream单例类

时间:2015-06-14 12:40:46

标签: c++ singleton iostream

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

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;
    }
};

in .cpp

OutputData *OutputData::odata = nullptr;

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

感谢

1 个答案:

答案 0 :(得分:0)

您不能通过复制获取任何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;
    }
};

虽然这种方法奇怪地看起来完全相反,但正如所谓的规范解决方案。