我有一组适用于文件的函数.最初我把它变成了一个类,唯一的私有成员是一个静态const std :: string,它是文件的名称.用户通过创建对象并从中调用函数来使用这些函数.但是,我认为我将转而
namespace FileHandler { // Functions to do stuff with file const std::string FILE_NAME; }
我有一个单独的命名空间实现文件,但我想知道如果文件名是一个类中的私有成员而失去封装是否值得使用命名空间.
你可以做类似的事情,但他们会有不同的语义.在类中,静态变量是声明,而不是定义,它仍然需要在类之外的定义;命名空间中的变量声明是一个定义,除非您将其标记为extern并且不提供初始值设定项.
在你的情况下它没有太大的区别,因为const变量默认具有内部链接,因此你可以在程序中有多个定义(每个翻译单元一个)而没有问题.
例如.
class Test { static const std::string FILE_NAME; };
是(在某些方面)相当于:
namespace Test { extern const std::string FILE_NAME; }
如果您这样做,则会将FILE_NAME声明为空字符串.您无法在同一翻译单元的其他位置重新声明它.
namespace Test { const std::string FILE_NAME; }
但是,你可以这样做.
namespace Test { const std::string FILE_NAME = "myfile.txt"; }
每个翻译单元都有自己的Test :: FILE_NAME版本,但它们都是一致的.