棋子层次结构设计:继承与类型字段

joe*_*_89 7 c++ oop inheritance chess

我有一个基础类

 class piece;
Run Code Online (Sandbox Code Playgroud)

以及包含派生对象的数组

piece* board[8][8];
Run Code Online (Sandbox Code Playgroud)

优势,通过虚拟功能进行清洁设计.缺点,如果我必须在板上找到一块或比较一件我必须恢复到动态铸造(或typeid).它很丑陋,在制作数百万个请求时可能会很糟糕.

另一方面,如果我创建一个单件类的数组,它有一个用于识别片段的类型字段,我没有这个问题(它应该更快)但我必须制作超级丑陋的switch语句.我想,由于件数是有限的,我不认为自己制造了那么多开关,这可能最终是一个更好的选择,你怎么看?

这很有趣(所以没有位板).

编辑1

阅读一些答案,我认为仅使用类型字段进行运算符重载(==,!= ...)可以带来两个单词的最佳效果.

boost :: variant看起来也很有趣.

Nim*_*Nim 5

或者,如果您的课程集是有限的 - 即您知道数字,请使用变体和访问者.例如,boost::variant<king, queen, bishop, knight ...>电路板由这种类型的2D阵列组成.现在要查询,你可以使用访客...

  • 并且开关比虚拟功能更快,因为...? (2认同)
  • @ 7vies虚拟函数调用需要单个解除引用.再说一次:交换机如何比虚拟函数调用更便宜? (2认同)

bcs*_*hes 4

我会选择类层次结构。

为了查找作品,您可以为每种作品类型保留一个单独的列表。这样您就知道在哪里寻找每种单品类型。

为了进行比较,您也可以依赖虚拟方法。

另一种方法是使用组件架构(如此处所述: http: //cowboyprogramming.com/2007/01/05/evolve-your-heirachy/),但我认为这对于您清楚知道的国际象棋游戏来说太多了类型并知道这些类型不会很快改变:)。