2012-03-28 56 views
1

以下哪approches的最好定義一個全局變量:C++ Singelton類Vs的命名空間與公開靜態變量

  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生成解析器時。 我需要定義全局變量才能在使用野牛語法時執行操作。

+4

noooooooooooooooooooooooooooooo。 。 。 – 2012-03-28 19:59:08

+0

你在問關於_worst_練習的錯誤問題。 CodeChords說,使用'clientData'。 – Useless 2012-03-28 20:04:46

+0

[C++ FQA](http://www.cs.technion.ac.il/users/yechiel/c++-faq/global-vars.html)[27.15]什麼是使用全局變量的良好編碼標準?這是聲明一個全局變量的理想方法:'// int xyz; ←使這個全球理想的東西是領先的//' ,不要使用全局變量 – 2017-11-02 11:15:50

回答

4

創建命令的原型是:

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

clientData可以將數據與命令關聯。然後,您可以使用您所需的數據,根本不需要全局數據!

順便說一句,你可能要tcl標籤添加到這個問題:-)

+1

感謝CodeChords,這真的很有幫助。 – 2012-03-28 20:38:35

+0

我想補充的另一件事是我使用野牛時有同樣的問題。有什麼我可以做的野牛文件,而不是定義全局變量? – 2012-03-28 21:22:04

+0

'ClientData'是一個'void *'(即一個單詞大小的指針),保證Tcl不會偷看它或將它投射到任何東西;它會被傳遞給'proc'回調函數,根本沒有任何解釋。當與C++方法集成時,這就是你通過'this'的地方(可能帶有額外的包裝)。 – 2012-03-29 14:45:44

0

如果你想使用全局單(你不應該想幹什麼!但他們是有用有時),C++的常見問題解答有一個體面的答案。

基本上:

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; 
} 
+0

使用Singleton是上述三種方法中最好的方法嗎? – 2012-03-28 20:41:12

+0

@balajikommineni這取決於很多事情。如果你是RAII的粉絲,假設你沒有循環全局單例依賴關係,那麼這個全球單身人士將會很好。關於哪種策略是正確的有很多爭議,但如果你問我,真正的問題是:你只有一個Reader嗎?一般來說,這就是單身人士的觀點。只有一個單一的控制點可以訪問一個班級。這可以像你的例子那樣非常方便。如果你不想/需要這些,考慮其他選擇,並採取什麼行之有效。也許可讀性很重要,等等。 – 2012-03-28 22:08:11

+0

謝謝OrgnlDave。 – 2012-03-28 23:06:32