C++ Singelton类Vs的命名空间与公开静态变量
以下哪approches的最好定义一个全局变量:C++ Singelton类Vs的命名空间与公开静态变量
- 公共静态类变量的所有私有变量的类
- 使用单个对象:(单例类)
- 名称空间 - 我应该只是使用一个名称空间来代替。
我不确定这个问题是否合理。只是试图找到最佳做法。
下面的代码在语法上不正确的,但我认为它应该传达的理念:
----------------------------------------------------------------
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生成解析器时。 我需要定义全局变量才能在使用野牛语法时执行操作。
创建命令的原型是:
Tcl_Command Tcl_CreateCommand(interp, cmdName, proc, clientData, deleteProc)
的clientData
可以将数据与命令关联。然后,您可以使用您所需的数据,根本不需要全局数据!
顺便说一句,你可能要tcl
标签添加到这个问题:-)
感谢CodeChords,这真的很有帮助。 – 2012-03-28 20:38:35
我想补充的另一件事是我使用野牛时有同样的问题。有什么我可以做的野牛文件,而不是定义全局变量? – 2012-03-28 21:22:04
'ClientData'是一个'void *'(即一个单词大小的指针),保证Tcl不会偷看它或将它投射到任何东西;它会被传递给'proc'回调函数,根本没有任何解释。当与C++方法集成时,这就是你通过'this'的地方(可能带有额外的包装)。 – 2012-03-29 14:45:44
如果你想使用全局单(你不应该想干什么!但他们是有用有时),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;
}
使用Singleton是上述三种方法中最好的方法吗? – 2012-03-28 20:41:12
@balajikommineni这取决于很多事情。如果你是RAII的粉丝,假设你没有循环全局单例依赖关系,那么这个全球单身人士将会很好。关于哪种策略是正确的有很多争议,但如果你问我,真正的问题是:你只有一个Reader吗?一般来说,这就是单身人士的观点。只有一个单一的控制点可以访问一个班级。这可以像你的例子那样非常方便。如果你不想/需要这些,考虑其他选择,并采取什么行之有效。也许可读性很重要,等等。 – 2012-03-28 22:08:11
谢谢OrgnlDave。 – 2012-03-28 23:06:32
noooooooooooooooooooooooooooooo。 。 。 – 2012-03-28 19:59:08
你在问关于_worst_练习的错误问题。 CodeChords说,使用'clientData'。 – Useless 2012-03-28 20:04:46
[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