Bengxy

优雅的构造C++的静态类

字数统计: 573阅读时长: 2 min
2017/10/10 Share

使用的场景

很多时候,我们希望在程序的运行过程中,只允许一个类实体存在,那么就需要用到静态类实例。

比如,在一个银行交易系统中,我们设计一个类,用来管理当天全世界的汇率。 很显然,在程序运行过程中,这个类只需要一个,多个实例反而会导致一些数据不一致的风险。

C++ Primer中使用到了一种做法,就是将类的内部变量设置为static

1
2
3
4
5
6
class BankRate{
public:
static double RMB2Dollar;
static double RMB2Euro;
//...
};

这么做有几个缺点

  • 全世界那么多国家,定义如此多的静态变量,难以维护。
  • 静态变量无法通过类的成员函数做操作

实现

相对于Java有static class设置静态类,C++也可以用一些技巧,实现静态类,并保证在运行过程中,有且只有一个实体存在。

主要是这几个步骤:

  • 在类内定义static的类实体,作为程序运行过程中的唯一实例。
  • 提供该静态实体的访问方法,返回实体的引用。
  • 把构造函数设置为private,避免程序运行过程中的重复构造

具体代码:

1
2
3
4
5
6
7
8
9
10
11
12
class BankRate{
public:
// 可以看做一个句柄,用来返回唯一实例
static BankRate& getInstance();
private:
BankRate(){};
~BankRate(){};
};
inline BankRate& BankRate::getInstance(){
static BankRate obj;
return obj;
}

简单分析一下

  • 首先,我们声明了一个静态的成员函数getInstance()。它的作用是返回类的静态化实例,具体内容我们稍后再定义。

  • 接着,我们把构造函数作为private,这一步主要是防止其他人不小心调用了BankRate(),导致系统中有两个类实体存在。

  • 然后,我们定义getInstance()函数,我们在函数内部定义一个静态的变量obj,这是一个类的实体。并以引用的方式返回。

  • 到这里,整个框架就完成的差不多了。

  • 最后,给getInstance()函数加上inline关键字,作为内联函数,减少调用时间。

总结

通过private的构造函数,阻止在类外创建类实例

利用成员函数内的静态变量作为类实体。

CATALOG
  1. 1. 使用的场景
  2. 2. 实现
  3. 3. 总结