我应该使用一类函数还是函数命名空间?

时间:2010-01-18 03:21:26

标签: c++

说我想要一些函数来处理某个文件,我正在考虑2个选项。

1)创建一个类似SavedDataHandler的类,用户可以像这样使用....

// Note that SavedDataHandler has no members. It just has functions that operate on a
// resource ( the file)
SavedDataHandler gameSave;
gameSave.SaveData( arg1, arg2 ); // to save data
gameSave.DeleteSave(); // Delete the save
...

2)创建函数名称空间

namespace SavedDataHandler {
  SaveData( ... ) { ... }
  DeleteSave( ... ) { ... }
  ...
}

用户会像

一样调用
SavedDataHandler::SaveData( arg1, arg 2 );
SavedDataHandler::DeleteSave();

什么是首选?

P.S。当我考虑Scott Meyer建议偏爱非会员非朋友功能到会员功能时,我想到了这一点。我已经遇到了一个决定,我有一个函数(通常是一些私有成员函数来帮助类做事),这可以很容易地成为非成员,因为它不在类私有上运行。

但是,该功能仅由该类使用。当然,程序可能会发展到另一个类可能需要它的程度,但我发现很难为这些非成员函数找到一个位置。当你有很多具有通用功能的函数时很容易,但我发现单个非成员函数很难组织到一个特定的地方,并发现将它作为成员保留清洁。关于这个问题的任何提示?

5 个答案:

答案 0 :(得分:4)

我倾向于以下简化模式:

  • 如果它仅由一个类使用并且可能保持这种方式,则将其放在匿名命名空间中的实现文件中。
  • 如果它用于多个类并且不需要访问类的内部状态,则将其放在命名空间中。
  • 如果需要访问类内部状态,当然要使其成为成员函数。

但意见不同,最终可能是雇主的指导方针是最终的。

编辑:

......当然不是 简单,但正如你提到Scott Meyers already covered的细节。

至于组织问题:
如果你将辅助函数放在匿名命名空间中,它们已经基本上与类分离了 - 如果你后来决定重用它们,那么在一个公共命名空间中将它们拉出来应该不会太难。 此时,您还应该更好地了解适合的组织,有时可能会提前做好。

答案 1 :(得分:1)

我的主观回答是:在包含静态方法的类上使用命名空间。

我的理由是,通过查看声明,您就会知道这段代码的目的。

如果它是一个类,那么没有什么能阻止它拥有实例方法。如果它是命名空间,那么你知道所有的功能都是独立的。

在学习C#时,这些概念与我同在。在C#中,你不能拥有独立功能。但是,您可以拥有静态类

internal static class SavedDataHandler
{
    // Because this is a static class, the compiler will not let you create an instance method

    internal static void ThisIsAStaticFunction() // This is fine
    {
    }

    internal void ThisIsAnInstanceFunction() // Compiler error!
    {
    }
}

由于C ++没有静态类的概念,因此命名空间就是最佳选择。

答案 2 :(得分:0)

直接包含包含游戏数据的类的save方法,传递表示数据保存到的媒体的辅助对象,并将删除方法放在媒体类本身上是有意义的。

答案 3 :(得分:0)

如果我必须自己回答问题,那就是:没关系。可以说,在这种情况下,函数名称空间和具有静态函数的类之间的区别只是语法。

但是,看起来您正在尝试为“SavedGame”对象建模。有没有理由为什么这些函数应该有一个没有状态的不同处理程序?

答案 4 :(得分:0)

看起来这个问题源于该计划其他部分的一些不健康的设计。我会看看你传递给处理程序的这些arg1和arg2的设计,它们可能是缺少抽象的地方。