我正在尝试用C ++编写一个用于设计电路的程序。在运行时,用户将能够创建新类型的组件并定义其各种属性(例如,引脚数,引脚名称)。然后,他们将能够创建一个包含这些各种用户创建的组件类型的多个实例的电路。当我尝试对此进行编码时,我最初创建了一个Component
类,它代表一种类型的组件并存储其引脚数,引脚名称等,以及一个ComponentInstance
类来表示该组件的一个实例作为电路的一部分。 ComponentIntance
类会将引用维护回Component
,以便对Component
的任何更改都会反映在其实例中。
当我坐下来考虑我的代码时,这看起来有点笨拙。我正在使用面向对象的语言,它提供了这种关系的设施:表示类型的类和表示实例的对象。我遇到的问题是我不知道如何利用这些设施,因为类型依赖于用户提供的输入。此外,用户应该能够更改类型的属性,并将这些更改反映在现有实例中。
我想也许我应该使用某种模板技巧来创建这个系统,但我不知道这是否是正确的方法,即使它是,我也不知道如何实际实现它。非常感谢任何帮助。
答案 0 :(得分:1)
根据你的说法:
此外,用户应该能够更改类型的属性,并将这些更改反映在现有实例中。
用户似乎可以在运行时更改属性 。如果是这样,那么模板参数对这些属性不会有用,因为它们必须在编译时确定并修复。
我在使用专门的EDA库时遇到过类似的问题。由于EDA库需要在运行时进行设计探索,因此在库的编译时无法修复电路元素的属性。我们最终为每种基本类型的元素创建了一个类:一个用于寄存器,一个用于多路复用,一个用于缓冲区,一个用于总线和信号等。每个类包含以下数据成员:
static const std::string typeName;
const std::string elementName;
std::vector
和/或std::map
' 同一个班级的两个实例应始终具有不同的elementName
' s。当且仅当它们具有相同的成员对象大小时,它们具有相同的电路属性。
在我们的例子中,用户不能/不会将某些属性的所有元素的属性更改为不同的属性(例如将所有32位寄存器更改为64位宽)。如果这是你想要的,也许可以使用从属性设置到具有该设置的电路元素集的映射:
std::map<std::pair<"register", 32>,
std::set<Register> > register32_elements;
如果存在32位的 N Register
个元素,将所有这些元素更改为64位的复杂度将为O( N )。但我们无论如何都需要更新每个寄存器。这可能是一种替代方案,可以创建比您的方法更少数量的C ++类(可能还有代码行)。
希望这会有所帮助......