在C++中使用静态成员作为类类型

EXP*_*XP0 2 c++ static

基于"c ++ primer",静态数据成员的类型可以是它所属的类类型:

class Bar {
 public:
     // ...
 private:
     static Bar mem1; // ok
 };
Run Code Online (Sandbox Code Playgroud)

但是,我很难想象这样一个功能有用的场景.我的意思是,为什么你需要一个变量作为类类型?有人可以给我一些例子吗?谢谢.

Lig*_*ica 5

唯一真正有用的时间是实现"单身人士"模式(或"简单"给那些鄙视它的人).

  • (特别是,既然你问得这么好,试图强制只有一个东西的某个对象让人怀疑它是否应该首先成为一个对象.这是对OO的滥用,就像现在这么多的代码那样声称面向对象只是因为它使用了所有类的类.) (2认同)

wat*_*180 5

单身人士是一种可能的用途.另一种可能的用途是提供一个预先打包的即用型实例.

假设您的类具有昂贵的构造函数,使用大量内存并且您需要创建许多实例.好消息是大多数情况都是相同的.您可以使用最广泛使用的副本静态,并在需要时重复使用它.

例.Bar可以用整数构造.从0构造的实例需求量很大.保持静态是一个很好的选择.

class Bar {
public:
    Bar(int n) : n_bar(n) {
        // if n!=0, construct new instance of Bar, else recycle static instance
    }

    void foo() const { // note, it is const
        if(n_bar==0)
            bar0.foo();
        else {
            // do something
        }
    }
private:
    int n_bar;
    static Bar bar0; // initialize to Bar(0)
};
Run Code Online (Sandbox Code Playgroud)

您也可以根据需要创建一整套静态实例(使用std :: map,其中int为键,Bars为值),而不是一个静态成员.