gpt4 book ai didi

C++ std::ofstream 类成员

转载 作者:行者123 更新时间:2023-11-30 01:21:56 25 4
gpt4 key购买 nike

第一次投稿,但我相信我已经正确检查了过去的帖子,但没有找到有效的解决方案。我正在使用 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 建议读取导致编译器错误...

谢谢,克里斯

最佳答案

代码具有未定义的行为,因为 _logfiledangling pointer在构造 A 之后,因为它正在获取 output 的地址,这是在 A 的构造函数中定义的局部变量:当 A 的构造函数完成,output 被破坏。 _logfile 随后在 do_something() 中取消引用,这是未定义的行为,可能是挂起的原因。

要解决,只需使用 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;
}
};

关于C++ std::ofstream 类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17280122/

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