【发布时间】:2023-03-04 14:52:01
【问题描述】:
我有以下用于存储经络和纬线的数据结构。
每个制图点存储:
A] 地理空间坐标、制图扭曲等
B] 指向北/南/东/西节点的指针。
它允许存储点之间的关系,首先是它们与 经线/平行...
class Node2DCart
{
protected:
//Coordinates of the point
double lat;
double lon;
double lattrans;
double lontrans;
double x;
double y;
.....
//Pointers to adjacent points in geographic network
Node2DCart *left;
Node2DCart *right;
Node2DCart *top;
Node2DCart *bottom;
.....
};
子午线的数据结构存储子午线的经度,开始 经线的点和终点以及点数。
class Meridian
{
private:
unsigned int points_count;
double longitude;
Node2DCart *start;
Node2DCart *end;
....
};
所有点都存储在节点列表中:
typedef std::vector<Node2DCart*> TNodes2DCartList;
class Node2DCartList
{
protected:
TNodes2DCartList nodes;
...
};
但是为 Node2DList 编写复制构造函数有一个大问题。 Meridian/Parallel 和 Node2Dlist 之间存在循环依赖关系。
复制构造函数使用std::map 并用新的替换旧点和链接,这不是实现问题...但是从类 Meridian 开始/结束的指针指向旧 Node2DList 中的点... Node2DList 复制构造函数应该必须通知所有指向旧 Node2DList 点的经络,并将所有指针更改为新 Node2DList 点。此模型不允许。
可能的解决方案是添加两个指向子午线和平行点所属的指针:
class Node2DCart
{
protected:
//Coordinates of the point
double lat;
double lon;
double lattrans;
double lontrans;
double x;
double y;
.....
//Pointers to adjacent points in geographic network
Node2DCart *left;
Node2DCart *right;
Node2DCart *top;
Node2DCart *bottom;
.....
Meridian *m;
Parallel *p;
};
恐怕这个提议的模型不好。两个班级之间仍然有自行车参考......有人可以帮我改进它吗?谢谢...
【问题讨论】:
-
当您说
Node2DList时,您是指TNodes2DCartList、Node2DCartList还是完全其他的意思?
标签: c++ copy-constructor datamodel cyclic-reference