隐藏C++命名空间中的变量

Rog*_*sey 3 c++ namespaces

我有一个旨在执行递归计算的函数.如果我的函数是递归编程的,那么计算时间太长.因此,我通过将中间结果存储在数组中来执行memoization.

我的程序的执行过程中,我可能会调用带参数的功能(10,0),(5,5),(2,4)等,因此我有一个setup(double x)填充用正确的价值观,整个阵列功能.然后我可以访问任何数组值而无需进一步计算.我只等到x改变再打电话setup().

我想知道如何在c ++中实现这一点.我使用类没有意义,因为我永远不需要创建关联的对象.我已经在命名空间中实现了很好的功能,但我仍然遇到了问题.即使我使用未命名的命名空间,我的函数使用的数组也是可见的,并且可以从函数的命名空间外部进行修改.如果我包含命名空间的头文件,那就是.

我的代码:

FunctionWrapper.h

namespace FunctionWrapper{
      namespace{
            double tempArray[10][10];
      }

      void setup(double x);
      void getValues(int n);
}
Run Code Online (Sandbox Code Playgroud)

Main.cpp的

#include "FunctionWrapper.h"

int main(){
   FunctionWrapper::tempArray[0][0] = 5; //Works
}
Run Code Online (Sandbox Code Playgroud)

Jam*_*lis 6

如果您不希望tempArray在其他源文件中可以命名,请不要在头文件中声明它.相反,在FunctionWrapper.cpp中的未命名命名空间中声明它.然后,它只能直接在该源文件中使用.

通常,头文件不应使用未命名的命名空间,因为它可能(并且经常会)导致违反一个定义规则.

请注意,对您的问题更好的解决方案实际上可能是创建一个提供此功能的类:

class ValueGetter
{
public:
    ValueGetter(double x);
    void GetValues(int n);

private:
    double cache[10][10];
};
Run Code Online (Sandbox Code Playgroud)

这样,您可以创建此类型的实例,并且该实例拥有所有状态.避免全局状态有许多好处,包括提高可维护性和可测试性.