C ++:静态方法VS全局函数VS命名空间VS.

时间:2013-07-08 20:59:19

标签: c++ namespaces global static-methods

  

可能重复:
  Namespace + functions versus static methods on a class

最合理的写作方式在哪里,例如,看起来像

的函数

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

(假设我写过课程PointLine)?

也许我可以更准确地提出问题:我正在考虑以下选项:

  1. 编写一个全局函数(在line.h中声明它,在line.cpp中写入)
  2. 编写类Line
  3. 的静态方法
  4. 使用命名空间。
  5. 写一个函数Point Line::intersection(const Line & otherLine);
  6. 我不是最后一个选项的粉丝,因为我不希望我的函数是“非对称的”(我的代码中还有其他几个函数的例子)。目前它们是全局函数(如选项1中所示),但我理解这不是“良好实践”。至于静态方法和命名空间,我还不熟悉这些,所以我不确定。

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

    感谢您的见解!

    编辑:为了让您了解我的项目规模:50到100个课程。

2 个答案:

答案 0 :(得分:3)

这实际上取决于你想做什么。如果您只是编写一个非常小的程序,我认为将其编写为全局函数并没有任何问题。但是,如果您的程序至少是中等大小,我建议使用静态方法,因为您将使用它处理的类对其功能进行分组。

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

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

答案 1 :(得分:3)

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

如果您的项目具有非平凡的大小,那么将两个类intersection()函数放在一个相同的命名空间中是值得的。参数依赖查找意味着只要类型为Line的对象作为参数,类的客户端就会获得交集函数:

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