2013-07-08 74 views
1

可能重复全局函数静态方法:
Namespace + functions versus static methods on a classC++:VS VS命名空间VS

哪里是写,例如最明智的办法,一个函数,看起来像

Point intersection(const Line &L1, const Line &L2);

(假设我已经写了类PointLine)?

也许我可以使这个问题更确切的一点:我正在考虑以下选项:

  1. 写全局函数(在line.h宣布,它在line.cpp写)
  2. 编写该类的静态方法Line
  3. 使用命名空间。
  4. 写,而不是一个功能Point Line::intersection(const Line & otherLine);

我是最后一个选项不是一个球迷,因为我不希望我的功能是“非对称”(我有这样的功能的其他几个例子在我的代码)。目前它们是全球性的功能(如选项1),但我明白这不是“良好的做法”。至于静态方法和命名空间,我还不熟悉这些,所以我不确定。

您认为什么是“最佳”设计?

感谢您的见解!

编辑:给你一个我的项目规模的想法:50到100个班。

回答

3

这真的取决于你想要做什么。如果你只是写一个非常小的程序,我并不认为把它写成一个全局函数会有什么问题。但是,如果程序的大小至少适中,我会建议使用静态方法,因为您会将其功能与其处理的类分组。

当然,你也可以用Namespace来做到这一点。然而,我想你会有一个Line类,因为它看起来很适合面向对象的编程风格。考虑到这一点,我真的不觉得有理由让它成为命名空间,而不是类Line的静态方法。如果我正在寻找交叉点方法,那当然是我首先要看的地方!

我没有看到最后一个选项有什么问题,但我更喜欢#2。

+0

另一种方法是去与#2,但反转的类。取决于你的设计。 Point Line :: intersection(const Line &L2); // L1是你打电话给 – MichaelH

+0

的线对象谢谢,我想我可能会使用静态函数然后 – Seub

2

如果您的项目足够小,可以使用PointLine之类的名称,而不必将它们放在命名空间中,那么可以使用intersection()函数执行相同的操作。请注意,重载解析意味着您可能不会在函数名称上出现任何名称冲突(但可能在类名称上)。

如果您的项目是非平凡的大小,那么将类函数放在同一个命名空间中是值得的。参数依赖查找意味着你的类的客户将获得交集功能时,他们使用Line类型的对象作为参数:

void f(MyGeoLib::Line l1, MyGeoLib::Line l2) 
{ 
    MyGeoLib::Point p = intersection(l1, l2); //just works 
} 
+0

感谢你。你如何看待静态方法虽然? – Seub

+0

我认为在这种情况下,一个静态方法实际上是违反直觉的,相交是“像一个运算符”,必须使用类名('Line :: intersection(l1,l2)')对我来说很直观 不要让它成为一个成员(不管它是否是静态的)的一个好理由是你可能想要其他的重载没有相同的参数类型:'intersection(Line,Surface)'应该是part线或Surface界面?我的答案是:既不是,它是你的几何库的一个接口。 – dhavenith

相关问题