¿Cómo modificar una funcion de clase para modificar una variable privada de otra clase?

publicado por: Anonymous

Tengo una clase B con un puntero variable de una clase A con un método que asigna a un puntero la variable de la otra clase A. Sin embargo esto crea una variable que está private. Asignar la variable crea una error luego. ¿Cómo puedo resolver este problema ?

class A {
private :
    int x;
public:
    A(int);
    ~A();
};

class B {
private :
    A * pA;
    int y;
public:
    B(int, int);
    ~B();
    void imprimer();
};

void B::imprimir() {
    cout << "B::imprimir: " << pA->x << " " << y << endl;
    }


main()
{
    B to(1, 2);
    to.imprimir(); //instruction (1)
}

Que me da el resultado :

    $ g++ td4Exercice1_2.cpp -o td4Exercice1_2
td4Exercice1_2.cpp: In member function ‘void B::imprimir()’:
td4Exercice1_2.cpp:7:6: error: ‘int A::x’ is private
  int x;
      ^
td4Exercice1_2.cpp:24:33: error: within this context
  cout << "B::imprimir: " << pA->x << " " << y << endl;

solución

Hola @Marine1 si quieres acceder a un atributo que esta privado lo mas natural es usando los modificadores de acceso getters y setters y no de manera directa aunque si lo quisieras lo mas claro y simple seria dejar publico el atributo.

En tu ejemplo hay unos detalles por los cuales no funciona de manera adecuada, primero la funcion miebro imprimir esta mal escrita, segundo el constructor y del destructor no estan siendo implementados y lo ya mencionado falta agregar el correspondiente getter del atributo “x”.

class A {
private :
    int x;
public:
    A(int);
    ~A();

    int getX();
};

int A::getX(){
    return x;
}

class B {
private :
    A * pA;
    int y;
public:
    B(int n1, int n2);
    ~B();
    void imprimir();
};

B::B(int n1, int n2){
   //alguna asignacion
}

B::~B(){
    //liberamos algo
}

void B::imprimir() {
    cout << "B::imprimir: " << pA->getX() << " " << y << endl;
 }


int main()
{
    B to(1, 2);
    to.imprimir(); //instruction (1)
    return 0;
}
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *