【问题标题】:How to access variables defined and declared in one function in another function?如何在另一个函数中访问在一个函数中定义和声明的变量?
【发布时间】:2012-07-31 18:38:46
【问题描述】:

谁能告诉我如何访问在另一个函数中声明和定义的变量。例如

void function1()
{
   string abc;
}

void function2()
{
   I want to access abc here.
}

如何做到这一点? 我知道使用参数我们可以做到这一点,但还有其他方法吗?

【问题讨论】:

  • 我建议你阅读范围界定,你会明白为什么这是不可能的。
  • 这根本没有意义:每次调用function1 都会有一个abc 实例。在for(int i = 0; i < 100; ++i) { function1(); } 中,你想要abc 的一百个实例中的哪一个?
  • 你知道静态成员吗​​?
  • 你真正想做什么?你为什么要这样做?正如您从答案中看到的那样,有许多替代方案可用。您应该做什么取决于您要实现的具体目标。
  • 好吧,我忽略了参数方法,因为我使用的是 Qt,当我使用 void function1(QString& abc) 时出现问题,它给了我一些奇怪的错误,但如果我使用 void function1(int& abcd) 它编译正确

标签: c++ scope


【解决方案1】:

C++ 方法是通过引用您的函数来传递abc

void function1()
{
    std::string abc;
    function2(abc);
}
void function2(std::string &passed)
{
    passed = "new string";
}

您也可以将字符串作为指针传递并在函数 2 中取消引用它。这更像是 C 风格的做事方式,并不安全(例如,可以传入 NULL 指针,如果没有良好的错误检查,它将导致未定义的行为或崩溃。

void function1()
{
    std::string abc;
    function2(&abc);
}
void function2(std::string *passed)
{
    *passed = "new string";
}

【讨论】:

    【解决方案2】:

    将其设为全局,然后双方都可以操纵它。

    string abc;
    
    void function1(){
        abc = "blah";
    } 
    
    void function2(){
        abc = "hello";
    } 
    

    【讨论】:

    • 我打算建议这个,但 OP 明确指出,variables declared and defined in a function
    • 如果他不熟悉变量作用域,那么他可能不知道这种方式是可能的。
    【解决方案3】:

    如果您想在 function2 中使用 function1 中的变量,那么您必须:

    1. 直接传过去,
    2. 具有更高范围的函数,可以同时调用两者 声明变量并传递它,或者
    3. 将其声明为全局,然后所有函数都可以访问它

    如果你的function2是从function1调用的,那么你可以把它作为参数传递给function2。

    void function1()  
    {  
        std::string abc;  
        function2( abc );  
    }  
    
    void function2( std::string &passed )   
    {   
        // function1::abc is now aliased as passed and available for general usage.
       cout << passed << " is from function1.";   
    }   
    

    如果 function1 没有调用 function2,但两者都被 function3 调用,则让 function3 声明变量并将其作为参数传递给 function1 和 function2。

    void parentFunction( )
    {
        std::string abc;  
        function1( abc );  
        function2( abc );  
    }
    void function1( std::string &passed )   
    {   
       // Parent function's variable abc is now aliased as passed and available for general usage.
       cout << passed << " is from parent function.";   
    }   
    void function2( std::string &passed )   
    {   
        // Parent function's variable abc is now aliased as passed and available for general usage.
       cout << passed << " is from parent function.";   
    }    
    

    最后,如果function1和function2都没有被相互调用,也没有被代码中的同一个函数调用,那么将要共享的变量声明为全局变量,function1和function2就可以直接使用了。

    std::string global_abc;  
    void function1( )   
    {   
       cout << global_abc << " is available everywhere.";   
    }   
    void function2( )   
    {   
       cout << global_abc << " is available everywhere.";   
    }    
    

    【讨论】:

      【解决方案4】:

      绝对没有办法。块的变量只能从该块直接访问。

      对象的指针/引用可以作为参数传递到从该块调用的函数中。

      【讨论】:

      • 这当然是错误的。作用域限制对象的名称在另一个块中可见。它不限制对对象的访问。可以通过传递引用等方式获得访问权限。
      • @EricPostpischil 但引用了什么?范围也定义了对象的生命周期,除非它是静态或动态分配的。此外,OP 指定“无参数”。
      • 将引用放在全局变量中。将引用传递给其他函数。将引用传递给一个函数,使其可供其他函数访问。将指针作为参数,并将引用存储在指向的位置。等等。
      • @EricPostpischil OP 想知道如何“如何访问在函数中声明和定义的变量......”
      • @juanchopanza:是的,是吗?正如我所写,可以通过多种方式获得访问权限。另一种是使用调试信息提供的自省工具。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-06
      • 2012-10-28
      相关资源
      最近更新 更多