C++ 从模板化基类派生的类

C++ 从模板化基类派生的类,c++,templates,C++,Templates,我对模板的实际使用还很陌生,所以我有以下设计问题 我正在设计类Bunch2d和Bunch4d,它们派生自抽象基类Bunch: class Bunch {virtual void create()=0;}; class Bunch2d : public Bunch {void create();}; class Bunch4d : public Bunch {void create();}; 类Bunch将包含一个容器、一个deque或一个vector(请参阅)的粒子: typedef Blit

我对模板的实际使用还很陌生,所以我有以下设计问题

我正在设计类
Bunch2d
Bunch4d
,它们派生自抽象基类
Bunch

class Bunch {virtual void create()=0;};
class Bunch2d : public Bunch {void create();};
class Bunch4d : public Bunch {void create();};
Bunch
将包含一个容器、一个
deque
或一个
vector
(请参阅)的
粒子

typedef Blitz::TinyVector<double,DIMENSIONS> Particle;
你能告诉我你对这个设计的看法吗?使用模板是否正确?OO概念的有效性如何?使用模板化基类


感谢您的帮助/回答/意见。

这里有一个注意事项:不同的模板实例(即参数中具有不同类型的模板类)具有不同的类型,因此不是单一的基类

如果需要多态性,则需要在设计中添加图层:

class Bunch
{
public:
  virtual void create() = 0;
  virtual ~Bunch();
};

template <Dimensions D>
class TBunch: public Bunch
{
private:
  typedef Blitz::TinyVector<double,D> Particle;
  std::deque<Particle> mParticles;
};

class Bunch2d : public TBunch<TwoDimensions>
{
public:
  ~Bunch2d();
  void create();
};
类束
{
公众:
虚空创建()=0;
虚~Bunch();
};
模板
类TBunch:公共束
{
私人:
typedef闪电战::TinyVector粒子;
std::deque mParticles;
};
第2D类:公共TBunch
{
公众:
~Bunch2d();
void create();
};
另一方面:
受保护的
属性应该被禁止

问题是耦合,因为
protected
将属性/方法公开给未知数量的类,这与
public
没有什么不同,因为不可能可靠地说明有多少方法将受到实现更改的影响

对于方法来说,这是可以接受的,因为方法可以保持向后兼容(有时会以一些技巧等为代价,但仍然如此)

对于属性,这是不可接受的,因为属性是实现细节,而不是接口,并且更改不能向后兼容

因此,我建议您永远不要对属性使用
protected
。在这种特殊情况下,最好在模板类中考虑对
mparticle
的访问,而不公开底层实现


小提示:如果你不能在
deque
vector
之间切换,而不破坏包含它们的类以外的东西,那么你就有了设计问题。

这里有一个注意事项:不同的模板实例(即参数中具有不同类型的模板类)具有不同的类型,因此,它们不是一个单一的基类

如果需要多态性,则需要在设计中添加图层:

class Bunch
{
public:
  virtual void create() = 0;
  virtual ~Bunch();
};

template <Dimensions D>
class TBunch: public Bunch
{
private:
  typedef Blitz::TinyVector<double,D> Particle;
  std::deque<Particle> mParticles;
};

class Bunch2d : public TBunch<TwoDimensions>
{
public:
  ~Bunch2d();
  void create();
};
类束
{
公众:
虚空创建()=0;
虚~Bunch();
};
模板
类TBunch:公共束
{
私人:
typedef闪电战::TinyVector粒子;
std::deque mParticles;
};
第2D类:公共TBunch
{
公众:
~Bunch2d();
void create();
};
另一方面:
受保护的
属性应该被禁止

问题是耦合,因为
protected
将属性/方法公开给未知数量的类,这与
public
没有什么不同,因为不可能可靠地说明有多少方法将受到实现更改的影响

对于方法来说,这是可以接受的,因为方法可以保持向后兼容(有时会以一些技巧等为代价,但仍然如此)

对于属性,这是不可接受的,因为属性是实现细节,而不是接口,并且更改不能向后兼容

因此,我建议您永远不要对属性使用
protected
。在这种特殊情况下,最好在模板类中考虑对
mparticle
的访问,而不公开底层实现


小提示:如果你不能在
deque
vector
之间切换,而不破坏包含它们的类之外的东西,那么你就有了一个设计问题。

你就会失去在运行时让Bunch类的指针指向Bunch2d或Bunch4d对象的能力,并通过该指针以多态方式操纵这些对象。如果不放松这一点对您很重要,那么不要将基类模板化。否则,在这里使用虚拟函数和抽象基类是毫无意义的,因此我建议只使用模板。

然后您将失去在运行时使用Bunch类指针指向Bunch2d或Bunch4d对象的能力,并通过该指针以多态方式操纵这些对象。如果不放松这一点对您很重要,那么不要将基类模板化。否则,在这里使用虚拟函数和抽象基类是没有意义的,所以我建议只使用模板。

首先,
Bunch
Bunch
就继承而言是完全不相关的类。因此,
Bunch2d
Bunch4d
没有公共基类

如果这对您来说是一个问题,您将不得不取消模板化,并在运行时将
维度
参数化。

首先,
Bunch
Bunch
就继承而言是完全不相关的类。因此,
Bunch2d
Bunch4d
没有公共基类


如果这对您来说是个问题,您将不得不取消模板,并在运行时将
维度
参数化。

不确定您的层次结构。。。在现实生活中,2D空间将是4D空间的特例,这是6D空间的特例。如果我是2D空间,我不想随身携带6维TinyVector。不确定你的层次结构。。。在现实生活中,2D空间是4D空间的特例,也是6D空间的特例。例如,如果我是2D空间,我不想随身携带6维TinyVector。但问题是容器中包含的“粒子”(的