首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在命名空间C++中隐藏变量

在命名空间C++中隐藏变量
EN

Stack Overflow用户
提问于 2012-01-08 21:39:48
回答 4查看 5K关注 0票数 6

我有一个函数,目的是执行递归计算。如果我的函数是递归编程的,那么计算时间太长了。因此,我通过在数组中存储中间结果来执行回忆录。

在我的程序执行过程中,我可能会用参数(10,0)(5,5)(2,4)等调用函数。因此,我有一个setup(double x)函数,它用正确的值填充整个数组。然后,我可以访问任何数组值,而无需进一步计算。我只能等到x更改后再调用setup()

我想知道如何在c++中实现这一点。使用类对我来说没有任何意义,因为我永远不需要创建关联的对象。我在名称空间中很好地实现了这些函数,但是我仍然有一个问题。即使使用未命名的命名空间,函数使用的数组也是可见的,可以从函数的命名空间外部修改。如果我包含名称空间的头文件,即。

我的代码:

FunctionWrapper.h

代码语言:javascript
复制
namespace FunctionWrapper{
      namespace{
            double tempArray[10][10];
      }

      void setup(double x);
      void getValues(int n);
}

Main.cpp

代码语言:javascript
复制
#include "FunctionWrapper.h"

int main(){
   FunctionWrapper::tempArray[0][0] = 5; //Works
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-01-08 21:44:58

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

通常,头文件不应该使用未命名的命名空间,因为它可能(而且经常会)导致一个定义规则冲突。

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

代码语言:javascript
复制
class ValueGetter
{
public:
    ValueGetter(double x);
    void GetValues(int n);

private:
    double cache[10][10];
};

通过这种方式,您可以创建此类型的实例,并且所有的状态都属于该实例。避免全局状态有许多好处,包括增加了可维护性和可测试性。

票数 7
EN

Stack Overflow用户

发布于 2012-01-08 21:45:11

作为一个类,这是有意义的,而这些函数作为类的成员也是有意义的。这些函数作用于这些数据,而且您不希望其他任何人访问该数据,这听起来是类的完美使用。你为什么反对呢?

票数 1
EN

Stack Overflow用户

发布于 2012-01-08 21:54:44

至于James的回答(和往常一样,非常好),我会构造这样的结构:

代码语言:javascript
复制
namespace {
class value_cache { 
     double temp_array[10][10];
     int x;
     void setup(double x);
     void internal_getValues(int); // same as your current GetValues
public:
     void getValues(int n) { 
         if (x != n) 
            setup(x=n);            
         internal_getValues(n);
     }
};
}

double function(int x, int y) {
     static value_cache c;

     c.getValues(x); 
     // probably more stuff here.
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8781588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档