我有一个旨在执行递归计算的函数.如果我的函数是递归编程的,那么计算时间太长.因此,我通过将中间结果存储在数组中来执行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)
如果您不希望tempArray在其他源文件中可以命名,请不要在头文件中声明它.相反,在FunctionWrapper.cpp中的未命名命名空间中声明它.然后,它只能直接在该源文件中使用.
通常,头文件不应使用未命名的命名空间,因为它可能(并且经常会)导致违反一个定义规则.
请注意,对您的问题更好的解决方案实际上可能是创建一个提供此功能的类:
class ValueGetter
{
public:
ValueGetter(double x);
void GetValues(int n);
private:
double cache[10][10];
};
Run Code Online (Sandbox Code Playgroud)
这样,您可以创建此类型的实例,并且该实例拥有所有状态.避免全局状态有许多好处,包括提高可维护性和可测试性.