gpt4 book ai didi

c++ - 可以在命名空间中包含变量吗?

转载 作者:太空狗 更新时间:2023-10-29 20:19:07 24 4
gpt4 key购买 nike

我有一组处理文件的函数。最初我把它做成一个类,唯一的私有(private)成员是 static const std::string 这是文件的名称。用户通过创建对象并从中调用函数来使用这些函数。但是,我想我将改用命名空间,因为它只是一组函数并且更有意义。唯一的问题是我仍然想保留那个常量字符串。按照这些思路做些事情会好吗?

namespace FileHandler {
// Functions to do stuff with file
const std::string FILE_NAME;
}

我有一个单独的命名空间实现文件,但我想知道由于文件名成为类中的私有(private)成员而导致的封装丢失是否值得使用命名空间。

最佳答案

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

在类中,静态变量是声明,不是定义,它仍然需要类外的定义;命名空间中的变量声明是一个定义,除非您将其标记为 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 版本,但它们都是一致的。

关于c++ - 可以在命名空间中包含变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2089545/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com