4

学校で自分のプロジェクト用に 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;
}
4

1 に答える 1

3

で作成tmpstd::ostream tmp(buf);、そのアドレスを で保存しoutますthis->out = &tmp;。ただし、tmpコンストラクターの最後でスコープ外になり、ポインターは有効なオブジェクトを指しなくなります。

代わりにすべきことはout、 aではstd::ostream*なく単に aを作成することですstd::ostream:

std::ostream out;

次に、コンストラクターで、準備ができたら、実行してbufそれを与えることができます。outout.rdbuf(buf);


編集への応答:

にはデフォルトのstd::ostreamコンストラクターがありません。バッファー ポインターを受け取る必要があります。私の間違い。ただし、修正は簡単です。コンストラクターのメンバー初期化リストを使用して、null ポインターを渡します ( nullptrC++110またはNULLC++03 の場合)。

Log::Log(const char *file)
  : out(nullptr)
{
  // ...
}
于 2013-02-08T21:34:43.257 に答える