我有3个与此问题相关的文件。 file.h,file.C和user.C。
file.h有一个私有成员,fstream logs。
在file.C的构造函数中,它会打开日志。它不会在构造函数中执行此操作,但构造函数会调用函数OpenLog()。
file.h也有一个内联关闭函数:
CloseLog(){if(logs)logs.close();}
文件user.C有一个exit函数,它创建一个文件实例,然后调用CloseLog。它此时会出现故障。我创建了一些其他的虚拟测试,看起来好像日志在混合中丢失了......
从file.C转到user.C然后回到file.C会导致这种情况。如果我将fstream日志作为文件中的全局日志。那么它可行 - 但我宁愿避免全局。
对我应该在这做什么的任何想法?请告诉我是否应该发布更多关于此的代码,我可以设置一些虚拟内容来更好地演示。
**这里有更多代码,按照要求 - 我无法复制和粘贴,所以请原谅缺乏请**
我将调用类helpME.h,helpME.C和user.C
// helpME.h
#ifndef _helpME_H
#define _helpME_H#include<的iostream>
#include< fstream的>
//各种包括class helpME {
私人:
fstream日志;公共:
void CloseLog(){if(logs)logs.close();}
};
#ENDIF// end helpME.h
// helpME.C
void helpME :: helpME(int argc,char ** argv)
{
//各种代码
OpenLog();
}void helpME :: OpenLog()
{
// logname设置在上面,我之前有一个打印声明,表明这是正确的 logs.open(logname,ios :: in | ios :: out | ios :: trunc);
}//结束helpME.C
// user.c的
void user :: quitHelpME(item)
{
helpME * hME =(helpME *)项目;
hME-> CloseLog();
}// end user.C
再次 - 请原谅缺乏清晰度,我想我可能只是通过添加这个来混淆更多...这个代码在另一个盒子上,无法复制。
答案 0 :(得分:0)
因为您已在.h文件中声明了您的变量,所以您有两个副本。编译器不会“看到”.h文件,它只是将文件中的内容复制/粘贴到.C文件中,这就是为什么你有两个变量副本。
在.h文件中将变量声明为extern
,并且仅在一个.C文件中再次声明它而不使用extern
,并且在任何声明中都不要使用static
文件..它应该解决你的问题。
答案 1 :(得分:0)
void user::quitHelpME(item)
{
helpME* hME = (helpME*) item;
这不会创建一个实例,它使用C样式转换从任何项目转换为指向helpME
的指针。
如果item为NULL,则在其上调用方法将seq fault。
否则在你的例子中仍然没有足够的细节给你一个答案,现在的代码似乎是合理的。