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。但问题是容器中包含的“粒子”(的