|
|
1
7
你是对的,你应该使用一个从键到创建函数的映射。
对于每个新的芯片驱动类ChipXXX,添加一个静态函数:
你的工厂职能应该是这样的:
|
|
|
2
5
工厂的意义不在于摆脱ifs,而是将它们放在真正业务逻辑代码的一个单独的地方,而不是污染它。这只是一种关注点的分离。 |
|
|
3
2
如果你很绝望,你可以编写一个jump table/clone()组合来完成这项工作,而不需要If语句。
然而,这种方法只有在拥有大量不同类型的芯片时才有价值。对于少数人来说,写几个if更有用。 简要说明:我使用了std::unordered\u map和std::unique\u ptr,这可能不是STL的一部分,具体取决于编译器的新版本。替换为std::map/boost::unordered\u map和std::/boost::shared\u ptr。 |
|
|
4
1
但是你可以优化你的代码或者从if语句中删除这两行代码。
|
|
|
5
1
回答您的问题:是的,您应该创建一个工厂,其中包含构造所需对象的函数的映射。构建的对象应该向工厂本身提供并注册该功能。 在其他几个问题中也有一些关于这个主题的阅读,所以我让你读一下,而不是在这里全部解释。 Is there a way to instantiate objects from a string holding their class name? |
|
|
6
0
你可以有
|
|
|
7
0
|
|
8
0
当然C++不允许构造函数是虚拟的,所以这需要一点诡计。常用的OO方法是使用
然后实例化这些原型的映射并使用它来构建对象(
另一种方法,如到目前为止所说明的,是类似的,包括直接注册方法而不是对象。这可能是你的个人喜好,也可能不是,但它通常会稍微快一点(不是很多,你只是避免了虚拟调度),而且内存更容易处理(你不必这样做)
但是,您应该注意的是内存管理方面。你不想泄密,所以一定要使用RAII习语。 |
|
AstralHex · 矩阵乘法代码工作不正常 1 年前 |
|
|
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 1 年前 |
|
|
Die4Toast · 递归调用成员箭头运算符-> 1 年前 |
|
|
Anka Hanım · 关于结构和动态数组地址的问题 1 年前 |