现在我使用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<double, double>* p = new Point;
那样做任何事情,所以我不必担心虚拟析构函数之类的东西。 我想这是辩论,我真的很想做#1,但我不知道这是不是一个坏主意,因为我听说从STL继承是一个禁忌。
答案 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;但你的观点不应该。