我正在学习C++(以及一般的编程),我正在尝试同时创建一个Point类和一个Line类.
一条线应由2个点对象组成.
C++大师可以查看我的工作并告诉我这是否应该如何恰当地使用指针,引用和类?
class Point { private: int x, y; public: Point() : x(0), y(0) {} Point(int x, int y) : x(x), y(y) {} } class Line { private: Point *p1; Point *p2; public: Line(Point &p1, Point &p2) : p1(p1), p2(p2) {} void setPoints(Point &p1, Point &p2) { this->p1 = p1; this->p2 = p2; } }
小智.. 7
您不应该在代码中使用指针.使用实际对象.指针在C++中实际上很少使用.
class Point { private: int x, y; public: Point() : x(0), y(0) {} Point(int x, int y) : x(x), y(y) {} } class Line { private: Point p1; Point p2; public: Line(const Point & p1, const Point & p2 ) : p1(p1), p2(p2) {} void setPoints( const Point & ap1, const Point & ap2) { p1 = ap1; p2 = ap2; } }
ChrisW.. 5
+1 zabzonk说的话.
使用指针的时间就像你使用它们一样:
你有几点
您想要使用这些点创建线条
您想要更改点的值并隐式更改线条.
如果行包含指向现有点的指针,则可以实现上面的步骤3.它引入了复杂性(例如,"当你破坏Point实例时,包含指向Point的指针的Line实例会发生什么?"),当(如zabzonk建议)每个Line包含自己的Point值时,它不存在.
您不应该在代码中使用指针.使用实际对象.指针在C++中实际上很少使用.
class Point { private: int x, y; public: Point() : x(0), y(0) {} Point(int x, int y) : x(x), y(y) {} } class Line { private: Point p1; Point p2; public: Line(const Point & p1, const Point & p2 ) : p1(p1), p2(p2) {} void setPoints( const Point & ap1, const Point & ap2) { p1 = ap1; p2 = ap2; } }
+1 zabzonk说的话.
使用指针的时间就像你使用它们一样:
你有几点
您想要使用这些点创建线条
您想要更改点的值并隐式更改线条.
如果行包含指向现有点的指针,则可以实现上面的步骤3.它引入了复杂性(例如,"当你破坏Point实例时,包含指向Point的指针的Line实例会发生什么?"),当(如zabzonk建议)每个Line包含自己的Point值时,它不存在.
您的行类的Point成员是否是指针会创建一个非常不同类型的类.使用指针将产生经典的CoGo风格方法,可以将其视为像板中钉子的点,线条是连接这些钉子的橡皮筋.改变一个点就像移动钉子一样,所有相关的线条都会自动跟随,这在某些应用中是可取的.
使用文字点意味着这些行彼此独立,这适用于其他类型的应用程序.
在此阶段,这是您的课程的关键设计决策.
编辑:正如其他帖子和下面的评论所述,利用简单的指针来实现多个线和点之间的关联也存在严重的潜在问题.具体来说,如果在内存中删除或移动一个点,则必须更新引用该点的所有指针.实际上,通过使用唯一的点ID来查找点而不是简单的指针,可以克服这种情况.这样也可以轻松地序列化/保存CoGo结构.因此,我们的point类将有一个静态成员来获取基于ID的点,而我们的行类将有两个点ID而不是指针.