我应该如何在cpp中设计一个结构?

时间:2019-04-29 11:25:14

标签: c++ oop

我有以下结构:

struct Point {
   double x, y;
   std::string name;
   vector<vector<double>> matrix;
}

从一开始我就知道除最后一个属性matrix之外的所有对象,为了计算matrix,我必须知道其他一些对象。

但是我想将matrix保留在Point结构中。由于没有point_id或类似的东西,这将允许我创建地图。

仅使用(x, y, name)构造函数,然后稍后在代码中显式设置matrix就是一种好的样式。

2 个答案:

答案 0 :(得分:5)

  

仅使用(x,y,name)构造函数然后在代码中稍后显式设置矩阵是一种好样式。

是的,可以创建不包含任何元素的矩阵,并且如果可以确定其最终大小,则可以设置其容量。

答案 1 :(得分:2)

  

但是我想将矩阵保留在Point结构中。由于没有类似的point_id或sth,因此我可以创建地图。

对标准C ++ containers的误解。它们不需要任何类型的“ id”,并且映射只需要对其键的类型进行比较操作。

请记住,std::map可以与 explicit Compare参数一起使用。您可能会提供一个仅比较x, y和/或name字段的字段。例如:

struct mycompare_st {
   inline bool operator() (const Point& x, const Point& y) {
     return x.name < y.name;
};

,并在定义适当的std::map<Point, Matrix, mycompare_st>类之后使用Matrix

std::set类似,它也接受比较函数,并且std::unordered_map可能被赋予相等运算和哈希运算,在某些情况下值得这样做。

顺便说一句,我认为将矩阵表示为向量的向量不是一个好主意(因为根据矩阵的定义,矩阵的每一列都具有相同的大小)。我建议您创建自己的Matrix类(或抽象数据类型)。

  

仅使用(x,y,name)构造函数然后在代码中稍后显式设置矩阵是一种好样式。

编码风格实际上是一种见解,但是您建议的做法是通常的做法。

您还可以对矩阵使用某种smart pointer。了解<memory> standard header。也许您的Point可能包含一些 std::unique_ptr<Matrix> matrixptr;字段?