2012-08-02 11 views
10

Kann mir jemand sagen, wie man auf Variablen zugreifen kann, die in einer Funktion in einer anderen Funktion deklariert und definiert sind. ZBWie kann man auf Variablen zugreifen, die in einer Funktion in einer anderen Funktion definiert und definiert sind?

void function1() 
{ 
    string abc; 
} 

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

Wie geht das? Ich weiß, dass wir Parameter verwenden können, aber gibt es einen anderen Weg?

+3

Ich schlage vor, Sie lesen Scoping, und Sie werden verstehen, warum es nicht möglich ist. –

+0

Das macht einfach keinen Sinn: Es gibt eine Instanz von 'abc' pro Aufruf von' function1'. In 'für (int i = 0; i <100; ++ i) {Funktion1(); } Welche der hundert Instanzen von 'ABC' willst du? –

+0

Kennen Sie statische Mitglieder? – phadaphunk

Antwort

12

Die C++ Art und Weise ist abc unter Bezugnahme auf Ihre Funktion zu übergeben:

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

Sie auch Ihre Zeichenfolge als Zeiger und dereferenzieren in function2 passieren kann. Dies ist mehr der C-Stil Art und Weise, Dinge zu tun und ist nicht so sicher (zB ein NULL-Zeiger in weitergegeben werden kann, und ohne gute Fehlerprüfung wird es nicht definiertes Verhalten oder Abstürze führen.

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

Vielen Dank, ich werde versuchen, Sie wissen zu lassen: D –

+0

Das hat funktioniert !! : D Danke! –

1

Es gibt absolut keinen Weg. Auf die Variablen des Blocks kann NUR von diesem Block aus zugegriffen werden.

Zeiger/Referenzen auf das Objekt können in Funktionen übergeben werden, die von diesem Block als Parameter aufgerufen werden.

+1

Dies ist, von Natürlich, falsch. Beim Scoping wird der Name eines Objekts in einem anderen Block nicht sichtbar gemacht. Es beschränkt den Zugriff auf das Objekt nicht. Der Zugang kann unter anderem durch Übergeben von Referenzen erhalten werden. –

+0

@EricPostpischil aber verweist auf was? Scoping definiert auch die Lebensdauer des Objekts, es sei denn, es ist statisch oder dynamisch zugewiesen. Außerdem hat OP "keine Parameter" angegeben. – juanchopanza

+0

Setzen Sie die Referenz in eine globale Variable. Übergeben Sie den Verweis auf die andere Funktion. Übergeben Sie den Verweis auf eine Funktion, die ihn für die andere Funktion zugänglich macht. Nehmen Sie einen Zeiger als Parameter und speichern Sie die Referenz in der angegebenen Position. Usw. –

6

es global Make dann beide können es manipulieren

string abc; 

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

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

Ich wollte dies vorschlagen, aber das OP gibt ausdrücklich an, 'Variablen erklärt und in einer Funktion definiert '. – JoeFish

+1

Wenn er nicht mit variablen Bereich vertraut ist, dann ist es möglich, dass er nicht wusste, dass dies möglich war. – BenN

+0

Danke! Ich werde es versuchen –

5

Wenn Sie eine Variable in function1 haben, die Sie in function2 verwenden möchten, dann müssen Sie entweder:.

  1. Pass direkt,
  2. haben eine höhere Scope-Funktion, die sowohl deklarieren die Variable aufruft und übergeben Sie es, oder
  3. es eine globale erklären und dann können alle Funktionen zugreifen es

Wenn Ihr function2 von function1 aufgerufen wird, dann können Sie übergeben Sie es einfach als Argument für 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."; 
} 

Wenn function1 nicht function2 nicht nennen, aber beide von function3 genannt werden, dann deklarieren function3 die Variable und übergeben es an beiden function1 und function2 als Argument.

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

Schließlich, wenn weder function1 noch function2 voneinander genannt wird, noch von der gleichen Funktion in Code, erklären dann die Variable als global geteilt werden, und function1 und function2 werden in der Lage sein, direkt zu nutzen .

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