0

我有 3 个与此问题相关的文件。file.h、file.C 和 user.C。

file.h 有一个私有成员 fstream 日志。

在 file.C 的构造函数中,它会打开日志。它不会在构造函数中执行此操作,而是构造函数调用函数 OpenLog()。

file.h 还有一个内联关闭函数:

CloseLog() {if (logs) logs.close();}

文件 user.C 有一个退出函数,它创建一个文件实例,然后调用 CloseLog。它在这一点上出现故障。我创建了一些其他的虚拟测试,看起来好像日志在某个地方丢失了......

从 file.C 到 user.C 然后返回到 file.C 会导致这种情况。如果我将 fstream 日志作为 file.C 中的全局日志,那么它可以工作 - 但我宁愿避免使用全局日志。

关于我应该在这里做什么的任何想法?如果我应该发布更多关于此的代码,请告诉我,我可以设置一些虚拟的东西来更好地演示这个。

**这里有更多代码,根据要求 - 我不能复制和粘贴,所以请原谅缺少它 **

我将调用这些类 helpME.h、helpME.C 和 user.C

//helpME.h
#ifndef _helpME_H
#define _helpME_H

#include <iostream>
#include <fstream>
//各种包含

类 helpME {
私人:
fstream 日志;

公共:
无效 CloseLog() {if (logs) logs.close();}
};
#万一

//结束帮助ME.h

//helpME.C
void helpME::helpME(int argc, char** argv)
{
//各种代码
OpenLog();
}

void helpME::OpenLog()
{
//logname 在上面设置,我之前有一个打印语句显示这是正确的
logs.open(logname, ios::in | ios::out | ios::trunc);
}

//结束帮助ME.C

//user.C
void user::quitHelpME(item)
{
helpME* hME = (helpME*) item;
hME->关闭日志();
}

//最终用户.C

再次 - 请原谅缺乏清晰度,我想我可能只是通过添加这个来混淆更多的东西......这个代码在另一个盒子上,不能被复制。

4

2 回答 2

0

因为你已经在 .h 文件中声明了你的变量,所以你有它的两个副本。编译器不会“看到” .h 文件,它只是将文件中的内容复制/粘贴到 .C 文件中,因此,这就是为什么您有两个变量副本的原因。

在 .h 文件中声明变量extern,然后在没有唯一一个 .C 文件的情况下再次声明它,extern并且不要static在该文件的任何声明中使用。它应该可以解决您的问题。

于 2010-07-14T20:57:48.023 回答
0
void user::quitHelpME(item)
{
helpME* hME = (helpME*) item;

这不会创建实例,它使用 C 样式转换从任何项目转换为指向helpME.

如果 item 为 NULL,那么在其上调用方法将 seq 错误。

否则你的例子中仍然没有足够的细节来给你答案,现在的代码看起来很合理。

于 2010-07-14T21:47:43.143 回答