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

标签 c++ static namespaces singleton

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

我有一些具有类似目的的函数,我想在全局范围之外使用。其中一些需要是公开的,其他应该是私有(private)的(因为它们只是“公共(public)”函数的辅助函数)。 此外,我不仅有函数,还有变量。它们只有“私有(private)”辅助函数需要,也应该是私有(private)的。

现在有三种方式:

  • 创建一个所有内容都是静态的类(相反:潜在的“不能在没有对象的情况下调用成员函数” - 并非所有内容都必须是静态的)
  • 创建一个单例类(相反:我需要这个对象)
  • 创建一个命名空间(没有私有(private)关键字 - 那我为什么要把它放在一个命名空间中呢?)

我该怎么做?组合这些方式的可能方式?

我想到了类似的东西:

  1. 制作单例,静态函数使用单例对象的辅助函数(这可能吗?我仍在类中,但访问它类型的对象)
  2. 在程序启动时调用的构造函数,初始化所有内容(-> 确保静态可以从单例对象访问函数)
  3. 只能通过 MyClass::PublicStaticFunction() 访问公共(public)函数

谢谢。

最佳答案

如前所述,使用全局变量通常是不好的工程实践,当然除非绝对需要(例如映射硬件,但这种情况并不经常发生)。

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

  • 因为人们不会突然构建您的对象的实例:为了什么目的?
  • 因为没有为命名空间生成自省(introspection)信息 (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

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

关于C++,静态与命名空间与单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5793334/

相关文章:

c++ - 无法使用计数排序获得正确的排序数组

Java 静态变量更新

html - 如何在纯静态网站上进行布局?

python - 检查类名(字符串)是否用于 Python 中的某个类

c++ - 更改 LLVM 函数的名称

c++ - unsigned long long 算术

c - 在 C 中使用 static 关键字的内部链接

java - ListView 上的属性缺少 Android 命名空间前缀

c++11 - 通过函数访问全局变量 - 跨命名空间的不同实例

c++ - 如何获得连续两帧的平均输出?