C++Singelton类与命名空间与公共静态变量

C++ Singelton Class Vs Namespaces Vs Public Static Variables

本文关键字:静态 变量 命名空间 C++Singelton      更新时间:2023-10-16

以下哪种方法最适合定义全局变量:

  1. 公共静态类变量
  2. 将类的单个对象与所有私有变量一起使用:(singleton类)
  3. 名称空间-我应该只使用名称空间吗

我不确定这个问题是否有意义。只是想找到最佳实践。

下面的代码在语法上不正确,但我认为它应该传达这样的想法:

----------------------------------------------------------------
class Reader {
  Reader();
  Library* lib;
  static Reader* reader;
public:
  Reader* Instance () {
      if (!reader) { reader = new Reader() }
      return reader;
  }
  void setLibrary ( Library* ptr ) { lib = ptr }
  Library* getLibrary { return lib }
}
Reader* Reader::reader = NULL;
int main( ) {
  ...
  Library* lib = new Library("test");
  Reader::Instance()->setLibrary(lib);
  Reader::Instance()->getLibrary()->addCell("AND2X1");
 }
   -------------- OR -------------
class Reader {
   Reader();
public:
  static Library* lib;
}
Library* Reader::lib = NULL;
int main( ) {
  ...
  Reader::lib = new Library("test");
  Reader::lib->addCell("AND2X1");
 }
    ---------------- OR -----------------
namespace Reader {
   Library* lib = NULL;
}
int main( ) {
  ...
  Reader::lib = new Library("test");
  Reader::lib->addCell("AND2X1");
}
---------------------------------------------------------------

我正试图在我的C++程序中使用TCL_createCommand在TCL前端创建新命令。我无法将任何新参数传递给函数实现因此,我需要全局变量来访问函数中的一些数据。我找到的所有解决方案似乎都是使用全局变容。

我需要上述内容的另一个实例是在使用bison生成解析器时。在使用bison语法时,我需要定义全局变量来执行操作。

create命令的原型是:

Tcl_Command Tcl_CreateCommand(interp, cmdName, proc, clientData, deleteProc)

clientData允许您将数据与命令关联起来。然后,您可以使用所需的数据,而不需要全局变量!

顺便说一句,你可能想给这个问题添加tcl标签:-)

如果你想使用全局单例(你不应该这么做!但它们有时很有用),C++FAQ有一个不错的答案。

基本上:

class Foo_class {
  public:
  class bar {
    public:
    int x;
  };
  int x;
  Foo_class() { x = 2; mybar = new bar(); } // This constructor will be called on first reference to the singleton
  void set_bar(bar* what) { mybar = what; }
  bar *mybar;
};
Foo_class& Foo()
{
  static Foo_class *myclass = new Foo_class();
  return *myclass;
}
int main(void)
{
  typedef Foo_class::bar foobar;
  foobar hmph;
  hmph.x = 70;
  Foo().set_bar(hmph);
  foo().x = 7;
}