访问调用函数的局部变量

时间:2018-12-29 18:47:58

标签: c++ c++11

这是该问题的一个示例。我有一个很大的父函数,其中有两个子函数。实际上,此父函数位于用于其他用途的基类上,因此我不想重写父函数或包装函数以通过引用传递变量,因为其他子类继承不需要它们基地。 parentFunc也在多个线程上被调用,所以我不能仅仅将needThisInSecondWrappedFunc变量作为类级别的变量使用,因为这样会在线程之间错误地共享它。

在我看来,在父函数上创建局部变量对于两个子函数都是可见的,然后可以对parentFunc的局部变量进行操作,但事实并非如此。

#include <iostream>

void parentFunc(float& data);
void wrappedFunc(float& ref);
void secondWrappedFunc(float& ref);

void parentFunc(float& data)
{
float needThisInSecondWrappedFunc[3];
wrappedFunc(data);
secondWrappedFunc(data);
}

void wrappedFunc(float& ref)
{
    needThisInSecondWrappedFunc[0] = ref * 0.5f;
    needThisInSecondWrappedFunc[1] = ref * 0.5f;
    needThisInSecondWrappedFunc[2] = ref * 0.5f;
}

void secondWrappedFunc(float& ref)
{
    ref = needThisInSecondWrappedFunc[0] +
          needThisInSecondWrappedFunc[1] +
          needThisInSecondWrappedFunc[3];
}

int main()
{
    float g;
    g = 1.0f;
    parentFunc(g);
    std::cout << g << '\n';
    return 0;
}

我不确定为什么wrappedFunc和secondWrappedFunc无法看到parentFunc的局部变量-我认为此时的parentFunc局部变量仍在范围内?

1 个答案:

答案 0 :(得分:1)

在C ++中没有父函数访问的概念。

您只能访问全局范围(“全局”变量),然后才能访问当前函数内的局部变量。如果您在对象实例中,那么您也可以访问它们。

无法访问在另一个函数中声明的变量。

您需要做的是这样

void parentFunc(float& data);
void wrappedFunc(float& ref, float* needThisInSecondWrappedFunc);
void secondWrappedFunc(float& ref, const float* needThisInSecondWrappedFunc);

void parentFunc(float& data)
{
float needThisInSecondWrappedFunc[3];
wrappedFunc(data, needThisInSecondWrappedFunc);
secondWrappedFunc(data, needThisInSecondWrappedFunc);
}

void wrappedFunc(float& ref, float* needThisInSecondWrappedFunc)
{
    needThisInSecondWrappedFunc[0] = ref * 0.5f;
    needThisInSecondWrappedFunc[1] = ref * 0.5f;
    needThisInSecondWrappedFunc[2] = ref * 0.5f;
}

void secondWrappedFunc(float& ref, const float* needThisInSecondWrappedFunc)
{
    ref = needThisInSecondWrappedFunc[0] +
          needThisInSecondWrappedFunc[1] +
          needThisInSecondWrappedFunc[3];
}

或更妙的是,使用std::array<float, 3>