c++设计问题.模板新手

C++ design issue. New to templates

本文关键字:新手 问题 c++      更新时间:2023-10-16

我对c++模板相当陌生。

有一个类,它的构造函数有两个参数。它是一个保存数据列表的类——它实际上是一个国际象棋程序中的走法列表。

我需要保持我的原始类,因为它在其他地方使用,但我现在需要传递额外的参数给类,这样做有一些额外的私有数据成员,只专门化一个私有方法——其他一切将保持不变。我不认为派生类在这里对我有帮助,因为它们不会是类似的对象,而且私有方法是由构造函数调用的,它将调用基类的虚方法——而不是派生方法。

所以我想模板就是我的答案。我只是想知道下一步该怎么做。

Thanks in advance

你猜错了。模板不能像继承一样解决你的问题。

正如jtbandes在你的问题下面的评论中所说,使用组合。

创建另一个包含现有类的实例作为成员的类。根据需要将操作转发或委托给该包含对象(即,新类中的成员函数调用包含对象的成员函数)。根据需要添加其他成员,以及与它们一起工作的操作。

编写与新类交互的新代码。当你的新代码需要与旧代码交互时,根据需要传递包含的对象(或指向它的引用或指针)。

您可以选择将容器实现为模板,但这是一个实现选择,取决于您希望如何重用容器。

当您希望在编译时传递值、类型名或类等参数时,可以使用模板。当您希望对相同的方法使用完全相同的类,但将其应用于不同的参数时,可以使用模板。我认为你所描述的情况并非如此。

如果它们不是相似的对象,您可能需要创建一个专门的类(或函数集合)来从各种其他类中使用。

此外,您可以考虑创建一个基类并根据需要扩展它。使用虚拟私有方法应该允许您在运行时选择对象的方法实现,而不是基类的方法。

如果您指定它们需要共享什么,我们可能会帮助您更多,您的类有什么共同之处?

当前代码的概要如下:

class move_list{  
public:
  move_list(const position& pos, unsigned char ply):pos_(pos),ply_(ply){
  //Calculates moves and calls add_moves(ply,target_bitboard,flags)  for    each move
  }  
 //Some access functions etc...
  private:  
     //private variables
     void add_moves(char,Bitboard,movflags);
};

Add_moves在向量上的移动在生成时没有特定的顺序。但是,我的新类除了需要额外的数据外,与此完全相同:

move_list(const position& pos, unsigned char ply,trans_table& TT,killers& kill,history& hist):pos_(pos),ply_(ply),TT_(TT),kill_(kill),hist_(hist) {

和add_moves函数需要更改,以使用额外的数据在接收到移动时按顺序排列。其他的都是一样的。我想我可以写一个额外的方法来对列表进行排序,但是从以前的经验来看,在列表收到它时进行排序要快得多。