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

¿Fue útil?

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:

  1. reutilización de CPosition
  2. cómo influir en el estado de una forma (en este caso incluye un miembro de tipo CPosition , pero también puede incluir un int radius o algo más)
  3. 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:

  1. Haciendo público CCube :: Position
  2. Agregando métodos de acceso: CCube :: MoveTo (const CPosition & amp; p) y CCube :: GetPosition () const .

Como dijo @Firas: no juegues con friend hasta que estés realmente seguro de que lo necesitas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top