2012-08-02 17 views
10

¿Alguien puede decirme cómo acceder a las variables declaradas y definidas en una función en otra función? Por ejemplo,¿Cómo acceder a las variables definidas y declaradas en una función en otra función?

void function1() 
{ 
    string abc; 
} 

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

¿Cómo hacer eso? Sé que el uso de parámetros lo podemos hacer, pero ¿hay alguna otra manera?

+3

Le sugiero que lea sobre el alcance, y entenderá por qué no es posible. –

+0

Esto simplemente no tiene sentido: hay una instancia de 'abc' por invocación de' function1'. En 'for (int i = 0; i <100; ++ i) {function1(); } '¿cuál de las cien instancias de' abc' quieres? –

+0

¿Conoces miembros estáticos? – phadaphunk

Respuesta

12

El C++ es pasar abc por referencia a su función:

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

También puede pasar su cadena como un puntero y eliminar la referencia en function2. Esto es más cierto C-estilo de hacer las cosas y no es tan seguro (por ejemplo, un puntero NULL se podría pasar, y sin una buena comprobación de errores que causará un comportamiento indefinido o se bloquea.

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

Gracias, intentaré y le haré saber: D –

+0

¡Esto funcionó! : D ¡Gracias! –

1

No hay absolutamente ninguna manera. Se puede acceder directamente a las variables del bloque SOLO desde ese bloque.

Los punteros/referencias al objeto se pueden pasar a funciones que se llaman desde este bloque como parámetros.

manera
+1

Esto es, de Por supuesto, falso. El alcance limita el nombre de un objeto para que no sea visible en otro bloque. No limita el acceso al objeto. El acceso se puede obtener pasando referencias, entre otros medios. –

+0

@EricPostpischil pero referencias a qué? El alcance también define la duración del objeto, a menos que sea estático o dinámicamente asignado. Además, OP especificó "sin parámetros". – juanchopanza

+0

Ponga la referencia en una variable global. Pase la referencia a la otra función. Pase la referencia a una función que lo hace accesible a la otra función. Tome un puntero como parámetro y almacene la referencia en la ubicación apuntada. Etc. –

6

Que sea global, entonces ambos pueden manipularlo

string abc; 

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

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

Iba a sugerir esto, pero el OP especifica: 'variables declaradas y definidas en una función'. – JoeFish

+1

Si no está familiarizado con el alcance variable, entonces es posible que no supiera que esto era posible. – BenN

+0

Gracias! intentaré –

5

Si tiene una variable en function1 que desea utilizar en function2, a continuación, usted debe:.

  1. pase directamente,
  2. tener una función de alcance mayor que llama tanto declarar la variable y pasarlo, o
  3. declarar que un mundial y luego todas las funciones pueden acceder a él

Si su function2 se llama desde function1, entonces se puede simplemente páselo como argumento para 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."; 
} 

Si function1 no llama function2, pero ambos son llamados por FUNCTION3, a continuación, tener FUNCTION3 declarar la variable y lo pasan a tanto function1 y function2 como argumento.

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

Por último, si ninguno function1 ni function2 se llama el uno del otro, ni de la misma función en el código, a continuación, declarar la variable para ser compartido como mundial, y function1 y function2 podrán utilizar directamente .

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