Доступ к локальной функции вызывающей функции - PullRequest
0 голосов
/ 29 декабря 2018

Это игрушечный пример проблемы.У меня есть большая родительская функция, которая, помимо прочего, вызывает две дочерние функции.В действительности, эта родительская функция находится в базовом классе, используемом для других целей, поэтому я не хочу переписывать родительскую функцию или упакованные функции для передачи переменных по ссылке, поскольку они не понадобятся для наследования других дочерних классов.база.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 могут 't увидеть локальные переменные parentFunc - я думал, что локальные переменные parentFunc все еще будут в области действия в этот момент?

1 Ответ

0 голосов
/ 29 декабря 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...