封装类外的数据

时间:2012-05-01 22:05:59

标签: c++

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

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

namespace Foo
{
    struct Bar
    {
        string data;
    };

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

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

2 个答案:

答案 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中。 (也可能只传递/返回指针或引用。然后你可以向前声明它。)