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

时间:2012-10-18 09:17:37

标签: 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;

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

error: ‘std::ios_base::ios_base(const std::ios_base&)’ is private
我搜索了它,发现它是因为复制了流。据我所知,在此代码中没有复制ofstreams。

你能帮助我吗? 提前谢谢。

1 个答案:

答案 0 :(得分:6)

static Logger getLogger()
{
   return log;
}

尝试按值返回Logger,这需要复制构造函数。编译器生成的复制构造函数尝试复制成员debug。这就是你得到错误的原因。

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

static Logger& getLogger()
{
   return log;
}

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

正确的通话如下:

Logger& l = Logger::getLogger();

在这种情况下l引用Logger::log