加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在C中模拟静态构造函数?

发布时间:2020-12-16 10:15:52 所属栏目:百科 来源:网络整理
导读:无论如何我可以修改这个代码示例 #include stdlib.h#include iostreamclass Base {public: Base() { if(!m_initialized) { static_constructor(); m_initialized = true; } }protected: virtual void static_constructor() { std::cout "Base::static_constr
无论如何我可以修改这个代码示例

#include <stdlib.h>
#include <iostream>

class Base {
public:
    Base() {
        if(!m_initialized) {
            static_constructor();
            m_initialized = true;
        }
    }
protected:
    virtual void static_constructor() {
        std::cout << "Base::static_constructor()n";
    }
private:
    static bool m_initialized;
};

bool Base::m_initialized = false;

class Derived : public Base {
    void static_constructor() {
        std::cout << "Derived::static_constructor()n";
    }
};

int main(int argc,char** argv) {
    Derived d;
    return(EXIT_SUCCESS);
}

那么Derived :: static_constructor()被调用而不是Base的?我想初始化一堆静态变量,最合乎逻辑的地方是在类中的某个地方.

解决方法

我从Martin V Lowis的解决方案中采用了这个解决方案.主要区别在于它使用多重继承和CRTP:

template<class T>
class StaticInitializer : public T
{
  static bool initialized;
 public:
  StaticInitializer(){
    if(!initialized){
      T::static_constructor();
      initialized=true;
    }
  }
};

template<class T> bool StaticInitializer<T>::initialized;

class Base : public StaticInitializer<Base>
{
public:
  static void static_constructor() {
    std::cout << "Base::static_constructor()n";
  }
};
static Base _base;

class Derived : public Base,public StaticInitializer<Derived>
{
public:
    static void static_constructor() {
      std::cout << "Derived::static_constructor()n";
    }
};
static Derived _derived;

StaticInitializer的每个具体子类都获得了它自己的静态构造函数初始化方法,但是你保留了具有真正继承的优点.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读