1

我必须访问在其他函数中声明的变量。

认为f1()

void f1()
{
  double a;
  int b;
  //some operations
}

f2()

void f2()
{
  //some operations
  //access a and b from f1()
}

它可以在 C++ 中使用吗?怎么可能呢?

如此处所示传递对函数的引用不适合我的情况,因为这会破坏调用函数的顺序。声明全局变量也被拒绝。

4

4 回答 4

7

在 C++ 中,无法访问该函数范围之外的本地声明的函数变量。简而言之,您在这里要求的是:

我必须访问在另一个函数中声明的变量。

根本不可能。您尝试的任何似乎允许您这样做的事情都是未定义的行为。

您可以做的是将“f1”和“f2”作为类的方法,并将double aint b作为成员数据状态:

class c1
{
  double a;
  int b;

public:
  void f1();
  void f2();
};

void c1::f1()
{
  // f1 can access a and b.
  //some operations
}

void c1::f2()
{
  // f2 can see the changes made to a and b by f1
}

这满足了您的两个要求。即:

  1. 不使用全局变量。
  2. 没有参数引用被传递到有问题的方法中。
于 2013-09-10T04:19:06.317 回答
2

听起来您想f2从其他地方打电话f1,例如

void foo() { f1(); f2(); }

如果是这样的话:这些变量在被调用时甚至都不存在f2,所以没有什么可以访问的。
(而且您将范围误认为是生命周期。这些是非常不同的事情。)

可以做的一件事是通过引用所有需要它们的函数来传递变量。

void f1(double& a, int& b);
void f2(double& a, int& b);

void foo()
{
    double x;
    int y;
    f1(x, y);
    f2(x, y);
}
于 2013-09-10T07:59:28.373 回答
0
#include<iostream>
using namespace std;
class c1 {
    string a;
    string b;

public:
    void f1();
    void f2();
};

void c1::f1() {
    cin >> a;
    cin >> b;
    f2();
}

void c1::f2() {
    cout << "vals are: " << a << b;
}
于 2019-09-06T16:07:07.840 回答
0

您可以做的与greatwolf建议的类似。您可以在函数中使用类声明。这用于以下目的:您可以定义一个仅在当前范围内可用的函数,因此在该范围之外无法访问,并且该函数可以访问该范围内的变量,就好像它们是全局的一样。该类也仅在您当前的范围内定义。

void    MyVeryComplicatedFunction
{
    int A;
    class localvars
    {
    public:
        int *ARef;              // this serves as the "Global" variables
        std::vector<int>    B;  // this serves as the "Global" variables

        localvars(int *inA) ARef(inA);

        void RepetativeOperation(int C) {
            (*ARef) += C;
            B.push_back(C);
        }
    }localvars(A);

    localvars.B.push_back(4);
    A = 3;
    localvars.RepetativeOperation(2);
    localvars.RepetativeOperation(4);
    localvars.RepetativeOperation(8);

    printf("A = %d, B[3] = %d", A, localvars.B[3]);
}
于 2018-02-24T20:59:28.960 回答