c++ - 访问调用函数的局部变量

标签 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 局部变量仍然在范围内?

最佳答案

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> .

关于c++ - 访问调用函数的局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53972413/

相关文章:

c++ - 如何通过c++获取图像的所有像素数据(RGB)

c++ - 在连续内存中存储相同长度的字符串?

c++ - 带有参数的方法 (const T *&) or (T * &) or(const T * const &) or(T * const &)

C++11 lambda 作为默认函数参数

c++ - LSH 用于基于汉明距离的快速 NN 相似性搜索?

c++ - 是否可以在 vector 的构造函数中使用 lambda 函数?

c++ - ISO C++标准草案

c++ - 在 C++ 中使用 std::begin(collection) 与 collection.begin()

c++ - 在线程函数和普通函数中将 shared_ptr 传递给 weak_ptr 时的不同行为

C++ 将非模板成员函数调用转发到模板函数