AVR嵌入式C++无堆实现组合模式构造传参编译报错求助
问题根因
- 报错的直接原因是C++最令人头疼的解析(Most Vexing Parse):你在main中写的
LogSystem logSystem(Usart usart);代码被编译器判定为函数声明,而非对象实例化:编译器认为你声明了一个名为logSystem、返回值为LogSystem类型、入参为Usart类型的函数,因此logSystem不是类对象,调用log成员自然报错。 - 其他隐藏错误:
- LogSystem构造函数实现错误:入参usart被你在构造函数内重新定义的局部同名变量屏蔽,类成员变量usart没有被正确初始化,同时局部变量usart在构造函数结束后就会销毁。
- LogSystem的log方法被声明为static:静态成员函数无法访问非静态的类成员变量usart,后续调用会报错。
- log方法入参类型不匹配:你声明入参为
char*,但传入的字符串常量"Hello"是const char*类型,会触发类型错误。 - Usart类的所有方法均为static:如果是单USART外设场景没问题,但如果要做依赖注入区分多个外设实例,需要去掉static修饰。
所有修复都不需要使用动态内存分配,完全基于栈对象实现,符合嵌入式开发不使用堆的约束,也不需要new关键字适配AVR G++环境。
修复代码
usart.h(调整为非静态版本适配依赖注入)
#include <avr/io.h> #include <util/setbaud.h> class Usart { public: Usart() = default; ~Usart() = default; void init(void) const; void print(const char myString[]) const; };
logger.h
#include "usart.h" class LogSystem { public: // 入参用const引用避免不必要的拷贝,节省嵌入式内存 explicit LogSystem(const Usart& usart_); ~LogSystem() = default; void log(const char *msg) const; private: Usart usart; };
logger.cpp
#include "logger.h" // 用成员初始化列表初始化类成员usart LogSystem::LogSystem(const Usart& usart_) : usart(usart_) { usart.init(); } void LogSystem::log(const char *msg) const { usart.print(msg); }
main.cpp
#include "logger.h" int main() { // 栈上实例化Usart对象后传入构造函数,无堆分配 Usart usart; LogSystem logSystem(usart); // 也可以用花括号初始化避免解析歧义:LogSystem logSystem{Usart{}}; while(1) { logSystem.log("Hello"); } return 0; }
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

