2012-03-28 113 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