Programación General => C/C++ => Mensaje iniciado por: meyiyiyi en Miércoles 30 de Junio de 2010, 00:13
Título: FUNCIÒN FRIEND DE UNA CLASE, problemas!
Publicado por: meyiyiyi en Miércoles 30 de Junio de 2010, 00:13
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++
#ifndef _TBT_H_
#define _TBT_H_[code=cpp]
Código: C++
#include <iostream>
#include "string.h"
#include "arbol.h"
usingnamespace std;
void output()
{
int num = x;//linea 10
}
int main()
{
UnaClase objeto;
output();
}
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!
Título: Re: FUNCIÒN FRIEND DE UNA CLASE, problemas!
Publicado por: r0d en Miércoles 7 de Julio de 2010, 03:22
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).
Título: Re: FUNCIÒN FRIEND DE UNA CLASE, problemas!
Publicado por: diego.martinez en Miércoles 7 de Julio de 2010, 10:45
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++
class Prot
{
private:
int Midatoprivado;
};
si hago:
Código: C++
void Asigna(Prot * p)
{
p->Midatoprivado=0;
}
el compilador me dirá que no puede acceder al elemento privado.
Si hago:
Código: C++
class Prot
{
private:
int Midatoprivado;
friendvoid Asigna(Prot * p);
};
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.