我正在编写一些C ++函数,这些函数将生成以后可能会或可能不会被这些函数处理的数据(但不会在其他任何地方处理)。对于某些更高级别的GUI更改,这些函数是“低级别”。
我目前正在将这些函数包装在一个单独的命名空间中,并声明了一个静态(内部链接)向量以在向量中包含这些对象(对象被定义为结构,也包含在命名空间中)。因此,一般结构:
namespace Foo
{
struct Bar
{
string data;
};
void func1();
void func2();
static std::vector<Bar> cachedBars;
}
我真的不需要这个课程,并且我不想诉诸单身人士。这个解决方案足够吗?具体来说,内部链接命名空间范围集合是限制对该集合的访问的最佳方式,以及避免全局变量的所有陷阱,还是有更好的方法?
答案 0 :(得分:3)
实际上,我只是在.h
中声明了这些功能void func1();
void func2();
匿名命名空间下.cpp中的隐藏内容。
namespace
{
struct Bar
{
string data;
};
static std::vector<Bar> cachedBars;
}
void func1() { /* do something */ }
void func2() { /* do something else */ }
有了这个,func1和func2将可以从任何地方访问,但是Bar和cachedBars只能被.cpp中定义的函数访问,所以func1和func2。如果.cpp中没有其他内容,只有func1和func2能够修改cachedBars。
如果您不知道,在用于修改可见性时,匿名命名空间将具有与static关键字相同的效果。然而,它更强大,因为你几乎可以隐藏任何东西。
答案 1 :(得分:1)
确定。在这种情况下,我通常做的是将func1()
和func2()
函数放在.h
文件中。静态向量与函数体一起进入.cpp
。
我怀疑您需要在struct Bar
文件中显示.h
,因为通常函数返回或将该结构作为参数。但如果没有人需要了解结构 - 那么也将其隐藏在.cpp
中。 (也可能只传递/返回指针或引用。然后你可以向前声明它。)