我想实现一个接收文件路径作为参数的单例类。我试着编写以下代码。我知道它不起作用而且不好,但我无法找到原因......
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;
从现在开始,我希望每个班级都能够写入该流。
感谢
答案 0 :(得分:0)
您不能通过复制获取任何std::istream
或std::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;
}
};
虽然这种方法奇怪地看起来完全相反,但正如所谓的规范解决方案。