在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的每个具体子类都获得了它自己的静态构造函数初始化方法,但是你保留了具有真正继承的优点. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |