C ++ Singleton Class Vs命名空间与公共静态变量

时间:2012-03-28 19:55:13

标签: c++ static namespaces tcl bison

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

  1. 公共静态类变量
  2. 使用所有私有变量的类的单个对象:(单例类)
  3. 名称空间 - 我应该只使用命名空间。
  4. 我不确定这个问题是否有意义。只是想找到最佳实践。

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

    ----------------------------------------------------------------
    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");
    }
    ---------------------------------------------------------------
    

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

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

2 个答案:

答案 0 :(得分:4)

create命令的原型是:

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

clientData允许您将数据与命令相关联。然后,您可以使用所需的数据,根本不使用全局数据!

顺便说一句,您可能希望在此问题中添加tcl标记: - )

答案 1 :(得分:0)

如果你想使用一个全局单例(你不应该这样做!但有时候它们很有帮助),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;
}