2012-08-02 64 views
10

任何人都可以告訴我如何訪問另一個函數中聲明和定義的函數中的變量。例如如何訪問在另一個函數中的函數中定義和聲明的變量?

void function1() 
{ 
    string abc; 
} 

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

如何做到這一點? 我知道使用參數我們可以做,但有沒有其他方式?

+3

我建議你閱讀範圍界定,你會明白爲什麼這是不可能的。 – 2012-08-02 18:19:50

+0

這樣做毫無意義:每次調用'function1'都有一個'abc'實例。在for(int i = 0; i <100; ++ i){function1(); }'你想要'abc'的一百個實例中的哪一個? – 2012-08-02 18:21:00

+0

你知道靜態成員嗎​​? – phadaphunk 2012-08-02 18:29:25

回答

12

C++的方式是按引用傳遞abc給你的函數:

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

您還可以通過你的字符串作爲指針,取消對它的引用在函數2。這是更做事的C風格的方式,而不是安全的(例如,一個空指針可以傳遞,並且沒有良好的錯誤檢查會引起未定義的行爲或崩潰。

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

謝謝我會盡力讓你知道:D – 2012-08-02 18:59:04

+0

這工作! :D 謝謝! – 2012-08-03 07:27:48

1

絕對沒有辦法。塊的變量只能從該塊直接訪問。

指向對象的指針/引用可以傳遞到從此塊中調用的函數作爲參數。

+1

這是當然,錯誤。範圍設定將對象的名稱限制爲在另一個塊中可見。它不限制對象的訪問。訪問可以通過傳遞參考等方式獲得。 – 2012-08-02 18:21:44

+0

@EricPostpischil但引用什麼?範圍定義也定義了對象的生命週期,除非它是靜態的或動態分配的。此外,OP指定了「無參數」。 – juanchopanza 2012-08-02 18:25:46

+0

將參考放入全局變量中。將引用傳遞給其他函數。將引用傳遞給使其他函數可訪問的函數。以指針作爲參數,並將引用存儲在指向的位置。等。 – 2012-08-02 18:30:06

6

讓它全球再既可以操縱它

string abc; 

void function1(){ 
    abc = "blah"; 
} 

void function2(){ 
    abc = "hello"; 
} 
+1

我打算提出這個建議,但是OP明確指出,「在函數中聲明和定義的變量」。 – JoeFish 2012-08-02 18:26:40

+1

如果他不熟悉變量範圍,那麼他可能不知道這種方式是可能的。 – BenN 2012-08-02 18:45:25

+0

謝謝!我會嘗試 – 2012-08-02 19:01:38

5

如果在功能1要在函數2使用一個變量,那麼你必須:。

  1. 傳直接,
  2. 有一個調用都 聲明變量,並通過它,或
  3. 更高的範圍函數聲明一個全局的,然後所有的功能都可以訪問它

如果你的函數2是從功能1叫,然後就可以只是將它作爲參數傳遞給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沒有調用函數2,但都被稱爲功能3,則有功能3聲明變量,並傳遞到兩個功能1和功能2作爲參數。

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."; 
}  

最後,如果既沒有功能1也不函數2從相互調用,也沒有從代碼中的相同的功能,則聲明爲全局要共享的變量,功能1和功能2將能夠直接使用它。

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