::basic_ios':无法访问类 'std::basic_ios<_Elem,_Traits>"中声明的私有(private)成员-6ren"> ::basic_ios':无法访问类 'std::basic_ios<_Elem,_Traits>"中声明的私有(private)成员-这是我的第一篇文章。 我看了很多题目,似乎我做的还不错,但是当我尝试编译下面的代码时,我又遇到了上面的错误: // Header file #include #include #include -6ren">
gpt4 book ai didi

c++ - 类构造函数 "C2248: ' std::basic_ios<_Elem,_Traits>::basic_ios':无法访问类 'std::basic_ios<_Elem,_Traits>"中声明的私有(private)成员

转载 作者:搜寻专家 更新时间:2023-10-31 00:17:14 25 4
gpt4 key购买 nike

这是我的第一篇文章。

我看了很多题目,似乎我做的还不错,但是当我尝试编译下面的代码时,我又遇到了上面的错误:

// Header file

#include <fstream>
#include <ostream>
#include <string>

using namespace std;

class CLogger
{
private:
ostream m_oStream;

public:
CLogger(ostream& oStream);
CLogger(const string sFileName);
};

// Implementation file

CLogger::CLogger(ostream& oStream) :
m_oStream(oStream) // <-- Here is the problem?!
{
}

CLogger::CLogger(const string sFileName) :
m_oStream(ofstream(sFileName.c_str()))
{
}

你能帮帮我吗?

非常感谢!

最佳答案

CLogger::CLogger(ostream& oStream) : // <-- Here is the problem?!
m_oStream(oStream)

问题不在第一行,而是在第二行。

由于成员 m_oStream 被声明为非引用,上面的第二行试图复制 oStream 这是不可能的,因为 的复制构造函数code>std::ostream 通过将其设为 private 而被禁用,这就是您在错误消息 “无法访问私有(private)成员”中看到的内容。

修复是这样的:

std::ostream * m_oStream; //declare it as pointer.
bool m_deleteStream; //flag whether to delete m_oStream or not

现在这样做:

CLogger::CLogger(ostream& oStream) : 
m_oStream(&oStream), m_deleteStream(false)
{
}

CLogger::CLogger(const string sFileName) :
m_oStream(new std::ofstream(sFileName)), m_deleteStream(true)
{
//Note : in C++03, you've to pass sFileName.c_str() to
//the constructor of std::ostream
}

然后你要把析构函数写成:

~CLogger()
{
if ( m_deleteStream )
{
delete m_oStream;
}
}

重要的一点:因为这是一个资源管理(记录器)类,所以让它不可复制是个好主意,因为复制对记录器实例没有意义。

关于c++ - 类构造函数 "C2248: ' std::basic_ios<_Elem,_Traits>::basic_ios':无法访问类 'std::basic_ios<_Elem,_Traits>"中声明的私有(private)成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13955905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com