es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo cambiar el miembro privado de una clase a través de solo una clase específica en C++?

¿Cómo puedo cambiar el int ‘a’ dentro de la clase A pero restringir la función que cambia el int SOLO a la clase B? Ni siquiera quiero que A pueda cambiarlo.

He intentado crear una función amiga, pero obtengo un error que incluí en los comentarios del código. Luego intenté simplemente declarar anticipadamente la función como una función amiga en privado y luego crear la función en público, pero la clase C puede acceder a la función pública. Esto a pesar de que escribí (en la sección privada) que la función era una función amiga. ¿Puedo hacer “amigo” un valor privado? No estoy seguro de qué hacer aquí.

“`

#include <stdio.h>
#include <iostream>

int main() {

// declaración previa
class B;
class C;

class A {
private:
int a; // miembro privado que quiero editar, pero solo a través de la clase B.
int a2; // No quisiera poder acceder a esto en la clase B. Solo quiero acceder y modificar int a desde la clase B, sin ninguna otra variable. Si es posible.

<pre><code>// Uso no válido de un miembro de datos no estático 'a'
friend void test(int new_value) {
a = 5;
}

friend B;
</code></pre>

public:
};

class B {
private:
int b;
public:
change_a_value(A a_class, int new_int) {
a_class.test(new_int); // Quiero que esto sea posible.
}
};

class C {
private:
int c;

public:
change_a_value(A a_class, int new_int) {
a_class.test(new_int); // No quiero que esto sea posible.
}
};

return 0;
}

“`</stdio.h>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para restringir la función que cambia el int ‘a’ SOLAMENTE a la clase B, puedes declararla como una función miembro de la clase B y declarar la clase A como una clase amiga de la clase B. De esta manera, solo la función dentro de la clase B tendrá acceso para cambiar el int ‘a’ de la clase A. Aquí hay un ejemplo de cómo hacerlo:

    #include <iostream>
    
    class A {
    private:
        int a;
    
        friend class B; // declarar B como una clase amiga de A
    public:
        int get_a() const {
            return a;
        }
    };
    
    class B {
    public:
        void change_a_value(A& a_class, int new_int) {
            a_class.a = new_int; // B puede cambiar el valor de a_class.a porque es una clase amiga de A
        }
    };
    
    int main() {
        A my_a;
        B my_b;
    
        my_b.change_a_value(my_a, 5);
        std::cout << "a = " << my_a.get_a() << std::endl; // imprime "a = 5"
    
        return 0;
    }
    

    Ten en cuenta que para esta pregunta, he eliminado la variable ‘a2’ del ejemplo ya que no era relevante.

Comments are closed.