• Lunes 29 de Abril de 2024, 03:43

Autor Tema:  FUNCIÒN FRIEND DE UNA CLASE, problemas!  (Leído 1406 veces)

meyiyiyi

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
FUNCIÒN FRIEND DE UNA CLASE, problemas!
« en: Miércoles 30 de Junio de 2010, 00:13 »
0
Estoy tratando de utilizar funciones amigas a una classe. A ver si me pueden ayudar

con este problemita:
Tengo una clase en  arbol.h llamada UnaClase:
El arbol.h:

Código: C++
  1. #ifndef _TBT_H_
  2. #define _TBT_H_[code=cpp]
  •  
  • Código: C++
    1. #include <iostream>
    2. #include "string.h"
    3. #include "arbol.h"
    4. using namespace std;
    5.  
    6. void output()
    7. {
    8.     int num = x; //linea 10
    9. }
    10.  
    11. int main()
    12. {
    13.     UnaClase objeto;
    14.     output();
    15.  
    16.  
    17. }
    18.  

    En el main.cpp tengo la funciòn main y una funcion output. QUiero que esta funciòn

    utilice uno de los miembros de la clase UnaClase, para eso la hago amiga.
    El tema es que me da un error:

    Citar
    line 10 | error: `x' was not declared in this scope|

    Como q no fue declarado el miembro de UnaClase que utilizo en la clase output.. como

    es posible si al ser friend tendria permitido utilizar sus miembros? MUCHAS GRACIAS!

    r0d

    • Miembro activo
    • **
    • Mensajes: 37
    • Nacionalidad: fr
      • Ver Perfil
      • http://r0d.developpez.com/index-es.php
    Re: FUNCIÒN FRIEND DE UNA CLASE, problemas!
    « Respuesta #1 en: Miércoles 7 de Julio de 2010, 03:22 »
    0
    hola,

    una función no puede ser amigo (friend) de nadie.
    Solo las clases pueden ser amigas, una de otra (si Clase1 es amiga que Clase2, no significa que Clase2 es amiga de Clase1).

    diego.martinez

    • Miembro MUY activo
    • ***
    • Mensajes: 297
      • Ver Perfil
    Re: FUNCIÒN FRIEND DE UNA CLASE, problemas!
    « Respuesta #2 en: Miércoles 7 de Julio de 2010, 10:45 »
    0
    buenas:

    lo primero, SI, una clase puede ser amiga de una funcion, de hecho es una razon por la que usar friend y no unos buenos getter/setters (aunque NO lo recomiendo), puede ser un asunto de optimizacion de performancia.

    Que una funcion sea amiga significa que la funcion PUEDE acceder a los miembros y metodos PROTECTED O PRIVATE de la clase. NO que pueda accedera a ellos sin ni siquiera instanciarla!!.

    La funcion es independiente de la clase, pero inmaginate esto:
    Código: C++
    1.  
    2. class Prot
    3. {
    4. private:
    5.      int Midatoprivado;
    6. };
    7.  
    8.  
    9.  

    si hago:

    Código: C++
    1.  
    2. void Asigna(Prot * p)
    3. {
    4. p->Midatoprivado=0;
    5. }
    6.  
    7.  

    el compilador me dirá que no puede acceder al elemento privado.

    Si hago:
    Código: C++
    1.  
    2. class Prot
    3. {
    4. private:
    5.      int Midatoprivado;
    6.  
    7. friend void Asigna(Prot * p);
    8. };
    9.  
    10.  

    En cambio si declaro la funcion como amiga, el compilador me dejara ACCESO a los miembros y metodos privados/protected.

    En tu caso concreto, en la funcion pretendes acceder a una variable que NO EXISTE, no has instanciado la clase, no hay un objeto del que requerir la variable. Sin haber creado un objeto, no puedes acceder a sus miembros no estaticos.
    Si quieres acceder a la variable, declara STATIC y accede con el contexto por delante (tal y como te expliqué en el post anterior), eso si, los estaticos son UNICOS, mirate el patrón de monoestado en wikipedia.

     

    suerte!  :hola: