解决Boost.Asio IntervalTimer类成员无默认构造函数的编译错误
解决IntervalTimer作为类成员无默认构造函数的编译错误方案
方案1:构造函数初始化列表直接初始化
如果定时器的间隔、回调等参数在类构造时就能确定,直接在构造函数的初始化列表里完成三个IntervalTimer的初始化,完全绕开默认构造函数的需求。
示例代码:
class MyTestClass { private: IntervalTimer timer1; IntervalTimer timer2; IntervalTimer timer3; void func1() { /* 定时执行的逻辑1 */ } void func2() { /* 定时执行的逻辑2 */ } void func3() { /* 定时执行的逻辑3 */ } public: MyTestClass() : timer1(1000, std::bind(&MyTestClass::func1, this)), // 1秒间隔调用func1 timer2(2000, std::bind(&MyTestClass::func2, this)), // 2秒间隔调用func2 timer3(3000, std::bind(&MyTestClass::func3, this)) // 3秒间隔调用func3 {} void start_process() { timer1.start(); timer2.start(); timer3.start(); } };
方案2:用智能指针延迟初始化
如果定时器的参数要到start_process方法执行时才能确定(比如依赖外部传入的配置),可以用std::unique_ptr来包装IntervalTimer,延迟到需要的时候再创建实例。
示例代码:
#include <memory> #include <functional> class MyTestClass { private: std::unique_ptr<IntervalTimer> timer1; std::unique_ptr<IntervalTimer> timer2; std::unique_ptr<IntervalTimer> timer3; void func1() { /* 定时执行的逻辑1 */ } void func2() { /* 定时执行的逻辑2 */ } void func3() { /* 定时执行的逻辑3 */ } public: void start_process(int interval1, int interval2, int interval3) { // 按需创建定时器实例 timer1 = std::make_unique<IntervalTimer>(interval1, std::bind(&MyTestClass::func1, this)); timer2 = std::make_unique<IntervalTimer>(interval2, std::bind(&MyTestClass::func2, this)); timer3 = std::make_unique<IntervalTimer>(interval3, std::bind(&MyTestClass::func3, this)); timer1->start(); timer2->start(); timer3->start(); } };
方案3:用std::optional延迟初始化(C++17及以上)
C++17引入的std::optional可以让成员变量先处于未初始化状态,之后通过emplace方法直接在内部构造对象,既不需要默认构造函数,也不用手动管理指针内存。
示例代码:
#include <optional> #include <functional> class MyTestClass { private: std::optional<IntervalTimer> timer1; std::optional<IntervalTimer> timer2; std::optional<IntervalTimer> timer3; void func1() { /* 定时执行的逻辑1 */ } void func2() { /* 定时执行的逻辑2 */ } void func3() { /* 定时执行的逻辑3 */ } public: void start_process() { // 在optional内部直接构造定时器 timer1.emplace(1000, std::bind(&MyTestClass::func1, this)); timer2.emplace(2000, std::bind(&MyTestClass::func2, this)); timer3.emplace(3000, std::bind(&MyTestClass::func3, this)); timer1->start(); timer2->start(); timer3->start(); } };
内容的提问来源于stack exchange,提问作者Ashkanxy
相关产品推荐
相关产品推荐

