C ++头文件变量范围问题

时间:2010-07-14 20:44:05

标签: c++ header scope fstream

我有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

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

2 个答案:

答案 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。

否则在你的例子中仍然没有足够的细节给你一个答案,现在的代码似乎是合理的。