![](/img/trans.png)
[英]Having a class that has a write function, how to I pass it to a function accepting std::ostream&
[英]can i pass std::ostream& to a function expecting std::ofstream
我想要做的是:我想根據command-line
參數將我的錯誤消息重定向到 std::cerr 或文件。 如果沒有提供日志文件,那么程序應該 output 屏幕上的錯誤消息。 這是我的方法:
class A {
void SetLogFileStream(T& err_outstream);
};
//main.cpp
A a;
std::string filename;
T1* t1;
if(argc>2) {
filename = argv[1]; //if provided by command line
std::ofstream fp(filename);
t1 = &fp;
}
else {
std::ostream* err_outstream = &std::cerr;
t1 = err_outstream;
}
a.SetLogFileStream(t1);
function SetLogFileStream
的參數類型或T1
類型應該是什么,以便我可以將指針傳遞給文件或std::cerr
不,但反過來也是如此。 您可以將std::ofstream
傳遞給期望std::ostream&
的 function ,或將std::ofstream*
傳遞給期望std::ostream*
的 function 。 因此,您的 function 應該接受std::ostream
引用或指針。
將方法聲明為:
class A {
void SetLogStream(std::ostream& err_outstream);
};
您的代碼有幾個問題。 打開的文件 stream 脫離 scope 並被銷毀。 你需要像這樣修復它:
std::ofstream f; // <-- this have to remain in scope while you use it for 'a'
A a;
if(args > 2) {
f.open(argv[1]);
a.SetLogStream(f);
} else {
a.SetLogStream(cerr);
}
類型應該是 std::ostream。 它不會完全按照您的編碼工作,因為您的 function 參數是一個引用,而您的參數是一個指針。 但是解決這個問題(無論哪種方式),它都會起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.