2010-05-12 44 views
2

在我的C++应用程序中,我有时会创建用于故障排除的不同输出文件。每个文件都是在我们流水线操作的不同步骤创建的,很难知道文件是在哪个文件之前发生的(文件时间戳都显示相同的日期)。全球计数器在应用中:不好的做法?

我正在考虑在我的应用程序中添加一个全局计数器,以及一个增加并返回该全局计数器的函数(带有多线程保护)。然后我可以使用该计数器作为我创建的文件名的一部分。

这被认为是不好的做法?许多不同的模块需要创建文件,它们不一定相互连接。

回答

2

我认为,加入到文件名当前系统时间与足够的高精度会更清洁,更容易实现和维护

//helper function to encapsulate details 
string makeFileName(string filename) 
{ return filename + getCurrentTime(); } 

void MyClass::SomeMethod() 
{ 
    File f = CreateFile(makeFileName("myclassfile")); 
    ... 
} 
2

一般来说这并不差。在C++中,我会编写一个包含计数器和多线程保护的单例类。这将是更干净,并会避免使用像c中那样使用全局变量(您可以使用类静态变量)。

+4

这会单例类有一个静态'instance'方法,通过任何重返单身机会?如果是这样,那么它就像其他任何一个一样是全球性的 – Troubadour 2010-05-12 18:57:57

+4

[“单身人士:解决你自1995年以来从未有过的问题”](http://jalf.dk/blog/2010/03/singletons-solving-problems-you-didnt-know-you-never- had-since-1995 /) – 2010-05-12 19:12:48

1

我个人会为这些文件创建一个工厂,负责返回文件对象。你可以让那个函数(或类)有一个计数器的静态变量。

+0

这就是我通常处理日志的方式。它还使得提供标准文件名更容易,并确保一切都在同一地点结束。 – 2010-05-12 19:29:58

4

如果只是为了调试,是暂时的,并且不会被释放,你可以做任何最快最简单的事情。

另一方面,如果它有可能长期留在应用程序中并可能潜入发行版中,那么我肯定会花更多时间并编写一个基本的文件创建模块,以便其他所有模块都可以访问至。

0

我通常会放弃任何一种有利于静态成员变量的全局变量。它们执行相同的功能,并且可以限制如何更改和访问静态成员。

+0

他提到变量可以通过函数访问,而不是简单地将其作为'extern int fileCount;'扔在某个包含文件的顶部。鉴于他需要做的就是增加它并返回一份副本,这可能就足够了。 – 2010-05-12 19:41:45