basic_stream出现问题

Issues with basic_ostream

本文关键字:问题 stream basic      更新时间:2023-10-16

我在尝试编译代码时遇到此错误:

1>  c:mingwbin../lib/gcc/mingw32/4.6.2/include/c++/ostream: In constructor 'Log::Log(const char*)':
1>c:mingwbin..libgccmingw324.6.2includec++ostream(363,7): error : 'std::basic_ostream<_CharT, _Traits>::basic_ostream() [with _CharT = char, _Traits = std::char_traits<char>]' is protected
1>C:UsersAdamDocumentscscs176bhw2ftpftplog.cpp(6,26): error : within this context

不知道为什么,我没有自己制作我正在使用的ostream代码,我使用了这里的建议:创建ostream到文件或cout 的正确方法

我的代码如下,如果需要,很乐意提供更多信息:

// 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;
}

std::ostream::ostream()构造函数受到保护,这意味着它只能由其派生类调用,但不能由其封闭类调用。

若要修复错误,请初始化成员out

std::ostream的唯一公共构造函数接受std::streambuf*,例如:

Log::Log(const char *file)
    : out(std::cout.rdbuf())
// ...

请注意,使用std::cout.rdbuf()中的缓冲区初始化std::ostream是安全的,因为析构函数std::ostream::~ostream()不会解除分配其std::streambuf*成员。

或者,它可以用NULL/nullptr进行初始化。在这种情况下,请注意不要向流中输出任何内容,因为它会尝试取消引用NULL,从而导致未定义的行为,很可能只是与SIGSEGV一起崩溃。

大卫所说的话的扩展:

ostream只是输出流的"框架",是输出流(抽象类)基本功能的定义。它什么也不做,也没有实施。

你有没有试着写信给coutcout是在iostream中定义的,您不需要定义它,只需使用它!