尝试实现简单的 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::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;
}
};
虽然这种方法看起来很奇怪,但恰恰相反,被认为是规范的解决方案。
我想实现一个接收文件路径作为参数的单例 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::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;
}
};
虽然这种方法看起来很奇怪,但恰恰相反,被认为是规范的解决方案。