Ant*_*cca 2 c++ stl ansi visual-studio-2010
这是我的第一篇文章.
我阅读了很多主题,似乎我做得很好,但是当我尝试编译以下代码时,我再次遇到上述错误:
// 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()))
{
}
Run Code Online (Sandbox Code Playgroud)
你可以帮帮我吗?
非常感谢你!
CLogger::CLogger(ostream& oStream) : // <-- Here is the problem?!
m_oStream(oStream)
Run Code Online (Sandbox Code Playgroud)
问题不在第一行,而是在第二行.
由于成员m_oStream被声明为非引用,因此上面的第二行尝试复制oStream哪一个是不可能的,因为复制构造函数std::ostream是通过创建它private而禁用的,这是您在错误消息中看到的"无法访问私有会员."
修复是这样的:
std::ostream * m_oStream; //declare it as pointer.
bool m_deleteStream; //flag whether to delete m_oStream or not
Run Code Online (Sandbox Code Playgroud)
现在这样做:
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
}
Run Code Online (Sandbox Code Playgroud)
然后你要把析构函数写成:
~CLogger()
{
if ( m_deleteStream )
{
delete m_oStream;
}
}
Run Code Online (Sandbox Code Playgroud)
重要的一点是:由于这是一个资源管理(记录器)类,因此将其设置为不可复制是一个好主意,因为复制对记录器实例没有意义.
| 归档时间: |
|
| 查看次数: |
210 次 |
| 最近记录: |