c++ 17 inline 单例模式

需求 在写硬件驱动的时候,有些串口之类的硬件,适合独占访问,适合用单例模式去实现,那么 c++ 中如何实现单例呢? 解决 c++ 17 中拓展了 inline 变量,可以在类内部直接初始化静态变量,这样就方便实现单例模式。如果是需要在多线程情况下使用,那么还可以使用 std::once_flag, std::call_once() 之类的来确保只初始化一次,使用 once 之类的需要引入头文件 <mutex . /* * 多线程条件下只执行一次 * once_flag的生命周期。它必需要比使用它的线程的生命周期要长。所以通常定义成全局变量比較好。 */ static std::once_flag init_flag; // 单例模式 class singleton_pattern { private: inline static singleton_pattern* _instance_ptr{nullptr};// C++ 17 inline static 直接初始化 private: singleton_pattern() { cout << "constructor called" << endl; } singleton_pattern(singleton_pattern&) = delete; singleton_pattern& operator=(const singleton_pattern&) = delete; public: ~singleton_pattern() { cout << "destructor called" << endl; } static singleton_pattern* get_instance() { std::call_once(init_flag, []() { if (_instance_ptr == nullptr) _instance_ptr = new singleton_pattern; }); return _instance_ptr; } void print_addr() { cout << std::format("address: {} \n", (void*)_instance_ptr); } }; 参考 C++ 17 inline static 实现单例模式...

2023-05-19 · 1 min · 118 words · RamLife

c++ 类内初始化非常量静态成员

需求 在类内直接初始化非常量静态成员,编译时给了报错: error: ISO C++ forbids in-class initialization of non-const static member 解决 解决也非常简单,使用 C++17, 然后增加 inline 标识,就可以了。 class A { virtual void fun1(){}; int a; public: static inline int b=0; } 参考 C++:错误:ISO C++ forbids in-class initialization of non-const static member ‘A::b’

2023-05-19 · 1 min · 43 words · RamLife

c++ error: is an inaccessible base of

需求 今天编译报错 error: is an inaccessible base of 解决 这个问题解决也非常简单,主要是默认的继承实际上是 private, 所以不能直接访问父类的成员,只要在继承时,用 public 进行标识即可。 class A { public: virtual int add(int a, int b); }; class B : public A { int add(int a, int b) { return a + b; } }; 参考 ‘A’ is an inaccessible base of ‘B’解决方案 C++ is an inaccessible base of 问题的解决方法

2023-05-10 · 1 min · 58 words · RamLife