Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我能在这里避免沮丧吗?_C++_Inheritance - Fatal编程技术网

C++ 我能在这里避免沮丧吗?

C++ 我能在这里避免沮丧吗?,c++,inheritance,C++,Inheritance,我正在为数字PDE编写一套代码。以前,我们对不同维度的问题有单独的代码,并且有许多组成网格的对象类别,例如单元、面、边、顶点。我正在尝试编写一个与维度无关的代码,并尝试编写一个包含所有不同类型网格对象信息的基类。这个类能够处理我从单元格、面等所需要的一切,并且只根据对象的维度和嵌入的空间的维度来实现过程 class MeshObject { public: MeshObject(..., size_t base_dimension, size_t dimension);

我正在为数字PDE编写一套代码。以前,我们对不同维度的问题有单独的代码,并且有许多组成网格的对象类别,例如单元、面、边、顶点。我正在尝试编写一个与维度无关的代码,并尝试编写一个包含所有不同类型网格对象信息的基类。这个类能够处理我从单元格、面等所需要的一切,并且只根据对象的维度和嵌入的空间的维度来实现过程

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:我刚刚看到你的编辑,我现在明白了,我完全误解了这个问题!