在c ++中创建Point类

时间:2009-04-30 22:05:46

标签: c++ inheritance operator-overloading

现在我使用std :: pair来表示c ++中的2d点。但是,我因为不得不写

而感到恼火
typedef std::pair<double, double> Point;

Point difference = Point(p2.first - p1.first,
                         p2.second - p1.second);

而不是能够重载operator +和operator - 。

所以,我的问题是,要成为我的Point课程,我应该

  • 公开派生自std :: pair并添加我自己的成员函数?这很好,因为我的所有代码都可以保持不变。我不打算像std::pair<double, double>* p = new Point;那样做任何事情,所以我不必担心虚拟析构函数之类的东西。
  • 滚动我自己的Point类,这很烦人,因为我复制了std :: pair的功能,但是我“以纯粹的方式”。
  • 为std :: pair制作operator +和operator-的模板特化,不可否认,我不记得它们是否包含源文件或头文件。

我想这是辩论,我真的很想做#1,但我不知道这是不是一个坏主意,因为我听说从STL继承是一个禁忌。

8 个答案:

答案 0 :(得分:14)

您可以滚动自己的Point类,但在内部使用std :: pair来存储数据。这可以防止继承STL问题,但仍然使用std :: pair的功能。

答案 1 :(得分:2)

比滚动自己更好:抓住现有的免费Vector / Point库。一项建议:Essential Math for Games Programmers附加的建议。您可以使用您找到的任何库作为起点,然后从那里优化/专门化/调整。

答案 2 :(得分:2)

如果你想使用std :: pair的功能,我会赞成创建你自己的Point类并使用私有继承或组合。 typedef的问题(我相信你知道)是你写的任何带Point的函数也可以被表示为std :: pair&lt; double,double&gt;的任何函数使用,这可能无效。< / p>

考虑到这一点,另一种选择就是创建一些免费的构建器函数,比如

Point addPoints(const Point& p1, const Point& p2);
Point diffPoints(const Point& p1, const Point& p2);

(功能名称可能更好)。

答案 3 :(得分:1)

另一个选项可能是让你拥有自己的Point类,让你的类“拥有”一个代表点坐标的std ::对。

很多时候,“HAS A”(组合)关系优于“IS A”(继承)关系。

答案 4 :(得分:1)

我认为“最佳实践”会说你要推出自己的Point类。通过这种方式,您可以在未来的道路上轻松实现3D。

答案 5 :(得分:1)

私有继承又称继承实现,是你的朋友。

逻辑上遵循:Point不是std :: pair,你不希望从Point到std :: pair进行公共上传转换,但你确实想要使用std :: pair的内部。

另一种可能性是has-a关系或组合:每个Point都有一个内部使用的private std :: pair。

事实上,组合和私有继承之间没有太大区别,除了在后者中你可以在Point成员函数中强制向上转换为std :: pair。

答案 6 :(得分:0)

滚动你自己的Point类。这将允许您将来使用它做任何事情。具体来说,我之前已经解决了这类问题,而且我发现有用的是定义我自己的Point结构,并创建一个继承它的Point类。

完全披露:我不太喜欢STL。

答案 7 :(得分:0)

不要公开继承std :: pair,因为std :: pair有一个运算符&lt;但你的观点不应该。