C++,静态与命名空间与单例

blu*_*rnd 30 c++ singleton static namespaces

我已经在网上阅读了很多帖子和文章,但我找不到明确的答案.

我有一些具有类似用途的功能,我想要超出全局范围.其中一些需要公开,另一些应该是私有的(因为它们只是"公共"功能的辅助功能).另外,我不仅有函数,还有变量.它们只需要"私人"帮助函数,也应该是私有的.

现在有三种方式:

  • 创建一个静态的类(反对:潜在的"不能在没有对象的情况下调用成员函数" - 并不是所有东西都需要是静态的)
  • 制作单身类(反对:我需要对象)
  • 创建命名空间(没有私有关键字 - 为什么我要把它放在命名空间中呢?)

对我采取什么方式?结合其中一些方法的可能方法?

我想到了类似的东西:

  1. 制作单例,静态函数使用单例对象的辅助函数(这可能吗?我仍然在类中,但访问它的类型的对象)
  2. 在programm start调用的构造函数,初始化所有东西( - >确保静态可以从单例对象访问函数)
  3. 仅通过MyClass :: PublicStaticFunction()访​​问公共函数

谢谢.

Mat*_* M. 32

如上所述,使用全局变量通常是糟糕的工程实践,除非当然绝对需要(例如映射硬件,但这通常不会发生).

将类中的所有东西存放在类似Java的语言中,但是在C++中你不必这样做,事实上在这里使用命名空间是一个更好的选择,如果只是:

  • 因为人们不会突然建立你的对象的实例:到底是什么?
  • 因为没有为命名空间生成内省信息(RTTI)

这是一个典型的实现:

// foo.h
#ifndef MYPROJECT_FOO_H_INCLUDED
#define MYPROJECT_FOO_H_INCLUDED

namespace myproject {
  void foo();
  void foomore();
}

#endif // MYPROJECT_FOO_H_INCLUDED

// foo.cpp
#include "myproject/foo.h"

namespace myproject {

namespace {
  typedef XXXX MyHelperType;

  void bar(MyHelperType& helper);
} // anonymous

void foo() {
  MyHelperType helper = /**/;
  bar(helper);
}

void foomore() {
  MyHelperType helper = /**/;
  bar(helper);
  bar(helper);
}
} // myproject
Run Code Online (Sandbox Code Playgroud)

整齐地隐藏在源文件中的匿名命名空间是一个增强的private部分:不仅客户端不能使用内部的东西,而且他甚至根本看不到它(因为它在源文件中)因此不依赖于它(它具有明确的ABI和编译时优势!)

  • 谢谢.我认为这是解决我问题的最佳方案.我来自C#(一切都是类),这就是为什么这些(未命名的)命名空间解决方案对我来说是新的. (2认同)

jal*_*alf 8

不要把它变成单身人士

对于不直接依赖于这些变量的公共帮助函数,请将它们设置为非成员函数.将它们放在课堂上没有任何好处.

其余的,将它作为普通的非静态成员放在一个类中.如果您需要一个全局可访问的类实例,那么创建一个(但不要使它成为单例,只是全局).

否则,在需要时实例化它.

  • 另一个争论点可能是“将它们放在一个班级中没有任何好处”。获得了一件事,虽然微不足道:保存静态成员函数的类充当命名空间。我意识到`namespace`可以实现相同的效果,但也许来自Java背景的人不会。 (2认同)