2

我正在编写一些 C++ 函数,这些函数将生成这些函数以后可能会或可能不会处理的数据(但不会在其他任何地方处理)。这些功能是一些更高级别的 GUI 更改的“低级别”。

我目前将这些函数包装在一个单独的命名空间中,并声明了一个静态(内部链接)向量以在向量中包含这些对象(这些对象被定义为一个结构,也包含在命名空间中)。因此,一般结构:

namespace Foo
{
    struct Bar
    {
        string data;
    };

    void func1();
    void func2();
    static std::vector<Bar> cachedBars;
}

我真的不需要为此上课,并且对求助于单身人士不感兴趣。这个解决方案是否足够?具体来说,内部链接命名空间范围集合是限制对该集合的访问以及避免所有全局变量陷阱的最佳方法,还是有更好的方法?

4

2 回答 2

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 关键字具有相同的效果。但是,它更强大,因为您几乎可以用它隐藏任何东西。

于 2012-05-01T22:44:12.457 回答
1

行。在这种情况下,我通常做的是将func1()andfunc2()函数放入.h文件中。而静态向量.cpp与函数体一起进入内部。

我怀疑您将需要显示struct Barin.h文件,因为通常函数会返回或将该结构作为参数。但是如果没有人需要知道这个结构——那么也将它隐藏起来.cpp。(也有可能只有指针或引用被传递/返回。然后你可以前向声明它。)

于 2012-05-01T22:30:52.960 回答