簡體   English   中英

C ++ Singelton Class Vs命名空間與公共靜態變量

[英]C++ Singelton Class Vs Namespaces Vs Public Static Variables

以下哪個approches最適合定義全局變量:

  1. 公共靜態類變量
  2. 使用所有私有變量的類的單個對象:(單例類)
  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");
}
---------------------------------------------------------------

我正在嘗試使用Tcl_createCommand在TCL前端的C ++程序中創建新命令。 我無法將任何新參數傳遞給函數實現,因此我需要全局變量來訪問函數內部的一些數據。 我找到的所有解決方案似乎都在使用全局變量。

我需要上述的另一個實例是使用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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM