【发布时间】:2021-12-04 09:38:39
【问题描述】:
我对 C++ 还很陌生,这也是我在这里的第一篇文章。我正在尝试在嵌入式系统项目中使用 C++,这样我就可以采用 OOP 方法。我正在使用 AVR 交叉包工具链(AVR G++ 编译器)
我的问题是这样的:
根据我的阅读,堆不应该用于嵌入式系统中的动态内存分配。无论如何,无论如何,AVR G++ 中都没有“新”的实现。我正在使用组合,从一个 USART 驱动程序(我们称之为服务)和一个记录器(单例模式,也是一个服务)开始。
据我了解,服务应该在实例化时使用构造函数参数传递它们的依赖关系,但是当我尝试以这种方式组合所需的对象时,出现以下错误:
Main/main.cpp: In function 'int main()':
Main/main.cpp:21:13: error: request for member 'log' in 'logSystem', which is of non-class type 'LogSystem(Usart)'
21 | logSystem.log("Hello");
| ^~~
make: *** [Main/main.o] Error 1
我的感觉是我将对象作为构造函数参数传递的语法是错误的,但我不确定它应该是什么,因为我能找到的所有示例都使用构造函数定义中的“new”关键字来创建免费商店中的对象。有人可以帮忙吗?
代码:
在“usart.h”中:
#include <avr/io.h>
#include <util/setbaud.h>
class Usart
{
public:
// Constructor and destructor
Usart();
~Usart();
// Initialisation routine
static void const init(void);
// Utility function to transmit a string
static void const print(const char myString[]);
};
在“logger.h”中:
#include "usart.h"
class LogSystem
{
public:
LogSystem(Usart usart);
~LogSystem();
Usart usart;
static void const log(char *msg);
};
在“logger.cpp”中
#include "logger.h"
LogSystem::LogSystem(Usart usart)
{
Usart usart;
usart.init();
}
LogSystem::~LogSystem()
{
}
LogSystem::log(char *msg)
{
usart.print(msg);
}
在“main.cpp”中:
#include "logger.h"
int main()
{
LogSystem logSystem(Usart usart);
while(1)
{
logSystem.log("Hello");
}
return 0;
}
【问题讨论】:
-
你有一堆额外的使用类名
Usart散落在代码周围。LogSystem logSystem(Usart usart);不会创建名为logSystem的LogSystem对象的实例,它声明了一个名为logSystem的 函数,该函数将单个Usart实例作为其参数并返回一个 @ 987654333@。在您的LogSystem构造函数中,Usart usart;行声明了构造函数的局部变量,同时隐藏了usart参数和LogSystem::usart成员变量。 -
感谢您的评论@NathanPierson - 我明白您在说什么,我觉得这就是问题所在,但是我仍然不清楚应该如何正确执行这些实例化,可以请为我详细说明一下?我不明白的部分是我应该在构造函数中而不是做什么:
new Usart = usart;。 -
您可能想查看initializer lists 以了解如何初始化值。您还将一个特定的
Usart实例传递给构造函数。但是按照目前的设计,我不确定它到底应该做什么,因为Usart无论如何只有静态方法,所以我不确定它应该如何组合成LogSystem。 -
您的代码中有一些基本错误。回顾一些 C++ 书籍的早期章节,了解如何定义类和成员函数,会很棒。
-
感谢@NathanPierson - 你说得对,我一开始就对静态声明有错误的想法。
标签: c++ embedded avr composition