【发布时间】:2021-05-26 00:23:27
【问题描述】:
我有自己的 FIFO 类,可以正常工作,但我想扩展它的灵活性。
现在,进入 FIFO 的数据结构是在 FIFO 类中定义的,所以每个 FIFO 对象都有相同的数据结构。
如果每个对象都可以定义自己的 FIFO 结构并将其传递给 FIFO 类,那就太好了。 FIFO 类不应该关心结构的外观,它只是将传递给 FIFO 构造函数的任何结构排队和入队。这实际上远远超出了我目前的技能范围,但我想在一些帮助下,也许我可以完成。
这是一个我试图做但我无法编译的简单示例:
class FIFO
{
public:
FIFO(struct myStruct&, uint32_t depth)
{
std::array<myStruct, depth>;
}
};
struct struct1
{
double s1Var1;
uint32_t s1Var2;
};
struct struct2
{
bool s2Var1;
};
FIFO fifo1 = new FIFO(struct1, 16);
FIFO fifo2 = new FIFO(struc2, 8);
我在std::array<myStruct, depth> 行收到此错误:
错误:非类型模板参数不是常量表达式
这个错误在FIFO fifo1 = new FIFO(struct1, 16):
错误:'struct1' 没有引用值
struct2 FIFO fifo2 = new FIFO(struct2, 8) 出现同样的错误。
如果解决方案简单明了,我将不胜感激。如果在尝试之前我需要阅读一些主题,如果有人能指出我会很高兴。
看看 cmets,也许我应该更完整。这适用于具有许多可靠性可疑的外部设备(主要是 RS232 和一些 I2C)的嵌入式系统。设备的实际 IO 是非阻塞 DMA 或中断。所以,如果我有一个通过 UART 通信的 GPS 设备,GPS 驱动程序就知道它的 FIFO 结构应该是什么样子。 GPS 驱动程序实例化一个 UART 对象并将 GPS 结构传递给它。 UART 对象使用(在这种情况下)GPS 结构实例化一个 FIFO 对象。 FIFO类有常用的FIFO方法:入队、出队、isFull、isEmpty等
当总体状态机 (SM) 需要来自 GPS 的信息(例如定位)时,它会调用类似 GPS1.getPostionFix() 的方法。 GPS 驱动程序执行类似 uart.writeCommand(getFix) 的操作,最终返回消息在 UART 的 FIFO 中结束。在状态机的下一个循环中,SM 询问 GPS 驱动程序是否有可用的修复。 GPS 调用类似 uart.readFifo() 的方法返回 FIFO 中的最新消息,如果 FIFO 为空,则返回 -1。 GPS 驱动程序首先定义了 GPS 结构,因此它可以解析、处理并向 SM 提供定位。 UART 驱动程序对它入队或出队的结构一无所知,这对我来说似乎是体面的封装。如果有人还在阅读,也非常感谢采用这种方法的 cmets。
【问题讨论】:
-
“FIFO 类不应该关心结构是什么样的,它只是将传递给 FIFO 构造函数的任何结构排队和入队。”当你将一个元素出列时,你有什么计划来确定存储了哪个结构以及如何处理它?
-
@Eljay - 你遗漏了一个星号,或者你假设了一个可以接受指针作为参数的(模板化)类。
-
类似
FIFO<struct1>* fifo1 = new FIFO<struct1>(16);的东西? (@Peter • 修复了它。OP 的 sn-p 有同样的问题。) -
我也试试这个。
标签: c++ struct constructor