【问题标题】:Is there a way to pass different structs to a single class constructor有没有办法将不同的结构传递给单个类构造函数
【发布时间】: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&lt;myStruct, depth&gt; 行收到此错误:

错误:非类型模板参数不是常量表达式

这个错误在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&lt;struct1&gt;* fifo1 = new FIFO&lt;struct1&gt;(16); 的东西? (@Peter • 修复了它。OP 的 sn-p 有同样的问题。)
  • 我也试试这个。

标签: c++ struct constructor


【解决方案1】:

有没有办法将不同的结构传递给单个类构造函数

不,不可能将类型作为函数参数传递(构造函数是(特殊成员)函数)。

但是,可以将类型作为模板参数传递,构造函数可以是函数模板的实例......或者类本身可以是类模板的实例。例如:

template<class T, std::size_t depth>
struct Fifo
{
    Fifo()
    {
        std::array<T, depth> local_variable;
    }
};


Fifo<struct1, 16> fifo1;
Fifo<struct2, 8 > fifo2;

std::array本身就是这样一个类模板。


附:避免对类型使用全部大写的名称(不包括模板变量常用的单个大写字符名称)。这些名称通常是为宏保留的。

P.P.S 避免拥有裸指针。完全避免不必要的动态分配。

【讨论】:

  • 在这个论坛上获得真正有用​​的解决方案的速度总是让我感到惊讶,这是向前迈出的一大步。谢谢。
猜你喜欢
  • 2011-07-28
  • 1970-01-01
  • 2019-06-28
  • 1970-01-01
  • 2012-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多