【发布时间】:2021-03-04 13:04:35
【问题描述】:
在没有 MMU 的情况下编写嵌入式系统时,我不应该使用堆(因为内存碎片问题)。
部分软件用C(驱动程序)编写,逻辑用C++子集编写,无需动态分配内存。
由于单元测试,默认构造函数被删除。取而代之的是 - 有一个参考驱动函数指针结构的单参数构造函数。
driver.h:(纯 C 模块)
#pragma once
bool Init();
uint32_t ReadMeasurement();
module.hpp:(C++ 部分)
class Module {
public:
struct DriverApi {
void (*Init)();
uint32_t (*ReadData)();
};
Module() = delete;
explicit Module(DriverApi &aDriverApi);
private:
DriverApi& mDriverApi;
};
模块管理器:
module_manager.hpp:
class ModuleManager {
// (...)
private:
Module::DriverApi module_1; // I can't declare this in this way
Module::DriverApi module_2; // because of lack of default constructor.
Module::DriverApi module_3;
etc.
};
如何在不使用堆的情况下初始化module_1、module_2和module_3?还有n参数构造函数?
我知道的选项:
- 看起来很容易使用
std::shared_ptr,但后来std::make_shared使用堆。 - 我可以保留默认构造函数然后调用某事。像
Init(Module::DriverApi *aDriverApi)但这“违反”RAII。
还有其他方法可以创建“优雅”和嵌入式安全初始化吗?
【问题讨论】:
-
先定义一个
DriveApi对象,然后用它来定义Module对象?可以在任何范围内完成。 -
我不确定我是否理解这个问题。
Module::DriverAPI d; // do stuff with d; Module m(d);有什么问题? -
如果你的类没有默认构造函数,你需要调用另一个构造函数。你能解释一下为什么你认为你需要堆吗? (不清楚您要解决什么问题,更不用说您似乎要解决的问题)
-
让
mDriverApi成为参考似乎很奇怪。说的没错,但这确实让我想知道为什么。 -
关于更新的编辑。
Module::DriverApi module_1;很好。这是一个类成员声明,而不是实际定义。那里没有任何东西被初始化。它在ModuleManager的构造函数中,您实际上是在其中初始化成员。