【发布时间】:2021-03-14 15:49:14
【问题描述】:
我一直在用 C++ 编程语言为 SPI I/O 扩展器开发软件驱动程序。我决定以这种方式对 I/O 扩展器中的寄存器进行建模
class Register
{
public:
virtual bool read(void) = 0;
virtual bool write(uint8_t data) = 0;
virtual uint8_t getData(void) = 0;
virtual uint8_t getAddress(void) = 0;
};
template <class T, uint8_t address>
class TypedRegister : public Register
{
public:
TypedRegister::TypedRegister() : reg_address(address){}
bool read(void);
bool write(uint8_t data);
uint8_t getData(void);
uint8_t getAddress(void);
private:
const uint8_t reg_address;
T data;
};
将 I/O 扩展器中的所有寄存器放在一个数组中会很方便。问题是我无法以这种方式定义数组以避免内存的动态分配。数组定义
static constexpr uint8_t no_regs_in_expander = 18;
Register register_map[no_regs_in_expander];
不起作用,因为Register 是抽象类,所以唯一的一种可能性是以这种方式定义数组
static constexpr uint8_t no_regs_in_expander = 18;
Register* register_map[no_regs_in_expander];
但这意味着我需要通过new 运算符创建各个寄存器的实例,这在我的平台上是被禁止的。是否有任何可能性如何实现所有寄存器都可以在一个数组中并且实例是静态分配的状态?提前感谢您的建议。
【问题讨论】:
-
动态多态性不需要动态内存分配。你可以让
Register* ptr = &obj;指向一个对象TypedRegister<int, 0> obj;,然后在ptr上调用虚函数。在您的情况下,您可以使用register_map[0] = &obj;。 -
所有数组元素必须是同一类型。
Register是抽象的无关紧要 - 如果不是,您将有“切片”。 -
@DanielLangr true 但如何将它们放在同一个数组中?
-
@largest_prime_is_463035818 我不确定这是否是 OP 想要的(如果他们知道自己想要什么 :)。我会稍等一下回复。此外,这可能以前被问过,将检查重复项。
-
附带说明,您可能不需要在成员变量中复制模板参数
address。
标签: c++ arrays templates inheritance embedded