4
#include <iostream>
#include <fcntl.h>
#include <fstream>

using namespace std;

 class Logger
 {
    private:
            ofstream debug;
            Logger()
            {
                    debug.open("debug.txt");
            }
            static Logger log;
    public:
            static Logger getLogger()
            {
                    return log;
            }

            void  writeToFile(const char *data)
            {
                    debug << data;
            } 

            void close()
            {
                    debug.close();
            }               
};

Logger Logger::log;

このクラスを通じて、ファイルにログインする Logger クラスを作成しようとしています。しかし、次のようなエラーが発生します

error: ‘std::ios_base::ios_base(const std::ios_base&)’ is private

私はそれをグーグルで調べたところ、ストリームのコピーが原因であることがわかりました。このコードで理解している限り、ofstreams のコピーは行われていません。

みんな私を助けてくれませんか。前もって感謝します。

4

1 に答える 1

6
static Logger getLogger()
{
   return log;
}

by 値を返そうとLoggerしますが、これにはコピー コンストラクターが必要です。コンパイラによって生成されたコピー コンストラクターは、 member のコピーを作成しようとしますdebug。そのため、エラーが発生します。

コピー コンストラクターを実装するか (メンバーが異なるため、おそらく意味がありませんdebug)、参照によって返すことができます。

static Logger& getLogger()
{
   return log;
}

この場合、静的ストレージ期間logがあるため安全です。

正しい呼び出しは次のようになります。

Logger& l = Logger::getLogger();

その場合lは を参照しLogger::logます。

于 2012-10-18T09:20:05.567 に答える