C++ 我能在这里避免沮丧吗?
我正在为数字PDE编写一套代码。以前,我们对不同维度的问题有单独的代码,并且有许多组成网格的对象类别,例如单元、面、边、顶点。我正在尝试编写一个与维度无关的代码,并尝试编写一个包含所有不同类型网格对象信息的基类。这个类能够处理我从单元格、面等所需要的一切,并且只根据对象的维度和嵌入的空间的维度来实现过程C++ 我能在这里避免沮丧吗?,c++,inheritance,C++,Inheritance,我正在为数字PDE编写一套代码。以前,我们对不同维度的问题有单独的代码,并且有许多组成网格的对象类别,例如单元、面、边、顶点。我正在尝试编写一个与维度无关的代码,并尝试编写一个包含所有不同类型网格对象信息的基类。这个类能够处理我从单元格、面等所需要的一切,并且只根据对象的维度和嵌入的空间的维度来实现过程 class MeshObject { public: MeshObject(..., size_t base_dimension, size_t dimension);
class MeshObject
{
public:
MeshObject(..., size_t base_dimension, size_t dimension);
...
private:
size_t _base_dimension;
size_t _dimension;
...
...
}
然而,为了使代码与我们现有的方案兼容,我们将希望使用派生类。例如,一个顶点的维数为0,我们可能有一行代码如下所示
Vertex v = mesh->get_vertex(vertex_number); // Will now return a MeshObject with dimension = 0
我可以通过让Vertex成为从MeshObject派生的类并执行向下转换来实现这一点:
class Vertex : public MeshObject
{
public:
Vertex(..., size_t base_dimension)
: MeshObject(..., base_dimension, 0) {} // i.e. sets dimension to 0
}
我可以对所有不同的对象类型执行此操作,并在必要时执行向下转换。然而,我想避免所有过度的悲观情绪。我宁愿吃像这样的东西
typedef MeshObject Vertex; // and somehow ensure that dimension = 0
有没有一种简单的方法来实现上述功能?还是一种避免定义派生类和向下转换的方法?任何关于解决方案或我的编码结构的想法都将不胜感激
为了增加一些清晰度。。。也许。。。顶点是具有_维=0的网格对象,边是具有_维=1的网格对象,面是具有_维=_基_维-1的网格对象,单元是具有_维=_基_维的网格对象,最后,网格将是网格对象向量的向量。
Vertex(..., size_t base_dimension)
: MeshObject(..., base_dimension, 0) {}
他不是一个沮丧的人。这只是普通的基类初始化。那么,您想使顶点
成为零维网格的别名,而不必编写所有样板
你可以写
template <size_t Dim>
class FixedDimensionMesh : public Mesh
{
public:
FixedDimensionMesh(..., size_t base_dimension)
: Mesh(..., base_dimension, Dim)
{}
};
using Vertex = FixedDimensionMesh<0>;
using Edge = FixedDimensionMesh<1>;
// ... etc ...
模板
类FixedDimensionMesh:公共网格
{
公众:
固定尺寸网格(…,尺寸\基础尺寸)
:网格(…,基准尺寸,尺寸)
{}
};
使用顶点=固定尺寸网格;
使用边=固定尺寸网格;
// ... 等
因此,您的中间模板将为您生成所有样板文件。
Vertex(..., size_t base_dimension)
: MeshObject(..., base_dimension, 0) {}
他不是一个沮丧的人。这只是普通的基类初始化。那么,您想使顶点
成为零维网格的别名,而不必编写所有样板
你可以写
template <size_t Dim>
class FixedDimensionMesh : public Mesh
{
public:
FixedDimensionMesh(..., size_t base_dimension)
: Mesh(..., base_dimension, Dim)
{}
};
using Vertex = FixedDimensionMesh<0>;
using Edge = FixedDimensionMesh<1>;
// ... etc ...
模板
类FixedDimensionMesh:公共网格
{
公众:
固定尺寸网格(…,尺寸\基础尺寸)
:网格(…,基准尺寸,尺寸)
{}
};
使用顶点=固定尺寸网格;
使用边=固定尺寸网格;
// ... 等
因此,您的中间模板将为您生成所有样板文件。在我读了两遍之后,我仍然不明白。
MeshObject
是网格的一部分,就像单元/面/向量一样,还是MeshObject
是由单元/面/向量对象组成的完整网格?(你应该做第二个)你的问题中没有任何东西让我认为任何地方都不需要基类或派生类。@Moing Duck对不起,网格将是网格对象的向量。我认为我也不需要派生类,但不确定解决方案是什么。另外,正如你可能知道的,我是一个数学家而不是一个程序员,解决方法是让网格不是网格对象的向量。网格通常包含面向量和顶点向量。我不知道这里的“细胞”是什么,但它也可能包含一个向量。我认为应该放弃网格对象的概念。@epiliam:我刚刚看到你的编辑,我现在明白了,我完全误解了这个问题!我读了两遍,还是不明白。MeshObject
是网格的一部分,就像单元/面/向量一样,还是MeshObject
是由单元/面/向量对象组成的完整网格?(你应该做第二个)你的问题中没有任何东西让我认为任何地方都不需要基类或派生类。@Moing Duck对不起,网格将是网格对象的向量。我认为我也不需要派生类,但不确定解决方案是什么。另外,正如你可能知道的,我是一个数学家而不是一个程序员,解决方法是让网格不是网格对象的向量。网格通常包含面向量和顶点向量。我不知道这里的“细胞”是什么,但它也可能包含一个向量。我认为应该放弃网格对象的概念。@epiliam:我刚刚看到你的编辑,我现在明白了,我完全误解了这个问题!