学校で自分のプロジェクト用に Log クラスを作成しようとしています。渡されるパラメーターに応じて、stdout またはファイルに情報を書き込むことができる必要があります。これを行う方法を調べていたところ、同様の質問があるスレッドに出くわしました。 std::cout または std::ofstream(file) から std::ostream を取得します
このスレッドと私のスレッドの唯一の違いは、クラス内で実行したいということです。std::ostream out(buf)
彼らはbufでオンザフライでostreamを使用して構築しますが、解決策を見てください。Logクラスでこれを適切に宣言して、Logコンストラクターに入ったときにのみ「out」オブジェクトを構築できるようにするにはどうすればよいですか?
以下で簡単に突き刺しましたが、それが正しいかどうか、または正しい軌道に乗っているかどうかはわかりません. 助けていただきありがとうございます。
out << "Some string" << endl;
編集:このログクラスが適切に機能するようになった後、できるようになりたいです。
EDIT2:以下の新しいコードでエラーが発生しましたerror : 'std::basic_ostream<_CharT, _Traits>::basic_ostream() [with _CharT = char, _Traits = std::char_traits<char>]' is protected
// log.h
#include <string>
#include <fstream>
#ifndef LOG_H_
#define LOG_H_
class Log
{
public:
enum Mode { STDOUT, FILE };
// Needed by default
Log(const char *file = NULL);
~Log();
// Writing methods
void write(char *);
void write(std::string);
private:
Mode mode;
std::streambuf *buf;
std::ofstream of;
std::ostream out;
};
#endif
// log.cpp
#include "log.h"
#include <iostream>
#include <stdlib.h>
#include <time.h>
Log::Log(const char *file)
{
if (file != NULL)
{
of.open(file);
buf = of.rdbuf();
mode = FILE;
}
else
{
buf = std::cout.rdbuf();
mode = STDOUT;
}
// Attach to out
out.rdbuf(buf);
}
Log::~Log()
{
if (mode == FILE)
of.close();
}
void Log::write(std::string s)
{
out << s << std::endl;
}
void Log::write(char *s)
{
out << s << std::endl;
}