amigo de la clase c ++
-
05-07-2019 - |
Pregunta
Estoy tratando de compilar dicho código:
#include <iostream>
using namespace std;
class CPosition
{
private:
int itsX,itsY;
public:
void Show();
void Set(int,int);
};
void CPosition::Set(int a, int b)
{
itsX=a;
itsY=b;
}
void CPosition::Show()
{
cout << "x:" << itsX << " y:" << itsY << endl;
}
class CCube
{
friend class CPosition;
private:
CPosition Position;
};
main()
{
CCube cube1;
cube1.Position.Show();
cube1.Position.Set(2,3);
cube1.Position.Show();
}
pero obtener 'CCube :: Position' no es accesible en la función main () 3 veces. Quiero que la clase CPosition se declare fuera de CCube para poder usarla en el futuro en nuevas clases, p. CBall :) pero ¿cómo puedo hacer que funcione sin usar herencia? ¿Es posible :)?
Saludos, PK
Solución
Además del captador normal, también debería tener un captador constante.
Por favor, tenga en cuenta la devolución por referencia. Esto le permite a cualquier llamada a SetXX () afectar la copia de Posición dentro de CCube y no la copia que ha estado actualizando.
class CCube
{
private:
CPosition Position;
public:
CPosition& getPosition() { return Position; }
CPosition const& getPosition() const { return Position; }
};
Otros consejos
La instrucción clase de amigo CPosition;
significa que CPosition ahora puede acceder a los miembros privados de la clase CCube. Para todas las demás clases, los miembros siguen siendo tan privados como los declaraste. Para que la muestra funcione:
class CCube
{
public:
CPosition Position;
};
error, no, la posición no es visible en la función " main "
Hacerlo público ... o poner una función getter pública en
La declaración de tu amigo debería ser
friend int main();
Usted está dando permiso 'principal' para acceder al miembro privado de CCube.
Bueno, ya tienes una respuesta para el error. Una cosa sin embargo: ¿Planea que el cubo acceda a los miembros privados de CPosition (itsX, itsY)? Si no, no necesita ser declarado como amigo. Si es así, considere exponer los métodos públicos en CPosition para devolver X e Y, y aún no necesita declararlo como amigo.
Lo que estoy diciendo es que debes asegurarte de que necesitas usar amigos. Aquí hay un buen lugar para comenzar .
OK funciona con:
class CCube
{
private:
CPosition Position;
public:
CPosition& getPosition() { return Position; }
};
main()
{
CCube cube1;
cube1.getPosition().Show();
cube1.getPosition().Set(2,3);
cube1.getPosition().Show();
}
Gracias
Tienes 3 preguntas en una:
- reutilización de
CPosition
- cómo influir en el estado de una forma (en este caso incluye un miembro de tipo
CPosition
, pero también puede incluir unint radius
o algo más) - Uso de la palabra clave
friend
Usted claramente dice que necesita que se pueda acceder a la clase CPosition desde otros lugares. Bueno, es clase. El problema 1 está resuelto.
Si desea que los usuarios de CCube
puedan cambiar la posición de un CCube
, debe proporcionar un medio para eso:
- Haciendo público
CCube :: Position
- Agregando métodos de acceso:
CCube :: MoveTo (const CPosition & amp; p)
yCCube :: GetPosition () const
.
Como dijo @Firas: no juegues con friend
hasta que estés realmente seguro de que lo necesitas.