错误:'std :: ios_base :: ios_base(const std :: ios_base&)'是私有的

Cha*_*nya 4 c++ stream

#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;
Run Code Online (Sandbox Code Playgroud)

通过这个类我试图创建一个登录到文件的Logger类.但它给出了错误

error: ‘std::ios_base::ios_base(const std::ios_base&)’ is private
Run Code Online (Sandbox Code Playgroud)

我用谷歌搜索它,发现它是因为复制了流.据我所知,在此代码中没有复制ofstreams.

你们可以帮助我吗?提前致谢.

Luc*_*ore 6

static Logger getLogger()
{
   return log;
}
Run Code Online (Sandbox Code Playgroud)

尝试返回一个Logger值,这需要一个拷贝构造函数.编译器生成的复制构造函数尝试创建该成员的副本debug.这就是你得到错误的原因.

你可以实现一个拷贝构造函数(可能没有意义,因为debug成员会有所不同)或者通过引用返回:

static Logger& getLogger()
{
   return log;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下是安全的,因为它log具有静态存储持续时间.

正确的电话会是这样的:

Logger& l = Logger::getLogger();
Run Code Online (Sandbox Code Playgroud)

在这种情况下l指的是Logger::log.