很好在命名空间中有变量?

Ano*_*ous 3 c++ encapsulation namespaces

我有一组适用于文件的函数.最初我把它变成了一个类,唯一的私有成员就是static const std::string文件的名称.用户通过创建对象并从中调用函数来使用这些函数.但是,我认为我将转而使用命名空间,因为它只是一组函数并且更有意义.唯一的问题是我仍然希望保持该常量字符串.沿着这些方向做某事会好吗?

namespace FileHandler {
    // Functions to do stuff with file
    const std::string FILE_NAME;
}
Run Code Online (Sandbox Code Playgroud)

我有一个单独的命名空间实现文件,但我想知道如果文件名是一个类中的私有成员而失去封装是否值得使用命名空间.

CB *_*ley 5

你可以做类似的事情,但他们会有不同的语义.

在类中,静态变量是声明,而不是定义,它仍然需要在类之外的定义; 命名空间中的变量声明是一个定义,除非您标记为extern并且不提供初始值设定项.

在你的情况下它没有太大的区别,因为const变量默认具有内部链接,因此你可以在程序中有多个定义(每个翻译单元一个)而没有问题.

例如

class Test
{
    static const std::string FILE_NAME;
};
Run Code Online (Sandbox Code Playgroud)

是(在某些方面)相当于:

namespace Test
{
    extern const std::string FILE_NAME;
}
Run Code Online (Sandbox Code Playgroud)

如果你这样做,你会声明FILE_NAME为一个空字符串.您无法在同一翻译单元的其他位置重新声明它.

namespace Test
{
    const std::string FILE_NAME;
}
Run Code Online (Sandbox Code Playgroud)

但是,你可以这样做.

namespace Test
{
    const std::string FILE_NAME = "myfile.txt";
}
Run Code Online (Sandbox Code Playgroud)

每个翻译单元都有自己的版本,Test::FILE_NAME但它们都是一致的.