繁体   English   中英

C ++ std :: ofstream类成员

[英]C++ std::ofstream class members

初次贡献者,但我相信我已经正确检查了过去的帖子,并且找不到有效的解决方案。 我正在使用Visual Studio 2012 ...

本质上,我要做的就是将输出流输出到对象拥有的日志文件中。 我对如何实现此目标没有任何挂念,但档案中没有任何内容。

据我了解,这个公认的解决方案应该可以工作:

#include <fstream>
// classA.h
class A {
private:
    std::ofstream * _logfile;
public:
    A(void);
    void dosomething(void) const;
}

// classA.cpp
#include classA.h
A::A(void) : _logfile(0) {
    std::ofstream output("logfile.txt",std::ofstream::app);
    _logfile = &output;
}

A::dosomething(void) {
    *_logfile << "Print something" << std::endl;
}

// main.cpp
int main() {
A a = new A();
a->dosomething();
}

这样可以编译,但只是挂起。 我猜很可能是因为输出在ctor端消失了。 什么是实现此功能的好方法? 其他StackOverflow建议阅读会导致编译器错误...

谢谢克里斯

该代码具有未定义的行为,因为_logfileA构造后A一个悬空指针 ,因为它获取的output地址是A的构造函数中定义的局部变量:当A的构造函数完成时, output被破坏。 然后在do_something()取消引用_logfile ,这是未定义的行为,并且可能是挂起的原因。

要解决此问题,只需使用std::ofstream成员并使A不可复制(因为流不可复制,但可移动):

class A {
private:
    std::ofstream _logfile;
    A(const A&);
    A& operator=(const A&);
public:
    A() : _logfile("logfile.txt",std::ofstream::app) {}
    void dosomething()
    {
        _logfile << "Print something" << std::endl;
    }
};

您有一个指向堆栈上对象的指针,构造函数完成后将删除该对象:

#include classA.h
A::A(void) : _logfile(0) {
    std::ofstream output("logfile.txt",std::ofstream::app);//it's on the stack
    _logfile = &output;//pointer to an object on the stack
}

A::dosomething(void) {
    *_logfile << "Print something" << std::endl;
}

更好地使用:

std::ofstream _logfile;

并将其初始化在构造函数的初始化列表中:

A::A(void) : _logfile("logfile.txt",std::ofstream::app){}

在构造函数中,您将_logfile设置为本地ofstream对象的地址。 当构造函数返回时,此对象将被销毁。 _logfile保留为悬空指针,并且您在dosomething函数中对其执行的操作会导致未定义的行为。 为什么不将_logfile声明为常规的ofstream对象,而不是指针?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM