Acceder a miembros privados de una clase en C++

  1. Utilice el especificador de acceso private para encapsular miembros de clase en C++
  2. Utilice funciones public para recuperar miembros privados de una clase en C++

Este artículo explicará varios métodos de cómo acceder a miembros privados de una clase en C++.

Utilice el especificador de acceso private para encapsular miembros de clase en C++

Los especificadores de acceso se emplean para implementar una característica central de la programación orientada a objetos, denominada encapsulación. Como resultado, restringimos el acceso directo a miembros de datos específicos de la clase y esencialmente construimos una interfaz para operar con los datos de la clase. C++ proporciona varias palabras clave de especificación de acceso como: public, private y protected, que normalmente preceden a los miembros de la clase que necesitan ser calificados con la accesibilidad correspondiente.

Los miembros definidos después del especificador private son accesibles solo a las funciones de miembros y no pueden ser referidos directamente desde el código que usa la clase. Una clase generalmente se construye con dos lados en mente: el diseñador de la clase y el usuario de la clase. Este último suele ser el que se ve afectado por la encapsulación. Si el programador define miembros antes del primer especificador de acceso, su accesibilidad se establece por defecto en private cuando se usa la palabra clave class y public en la palabra clave struct.

En el siguiente ejemplo, implementamos una clase llamada BaseClass con dos miembros de datos de cadena declarados como private, por lo que para acceder a los valores de estos miembros, el diseñador de la clase debe incluir funciones public que los recuperen. Observe que podemos eliminar la palabra clave public del código siguiente y seguir teniendo las funciones getUsername y getName como miembros public.

Otra ventaja de la encapsulación es la flexibilidad para modificar la estructura de clases interna sin preocuparse por los problemas de compatibilidad del lado del usuario. Mientras la interfaz, por lo tanto, las funciones públicas no cambien, el usuario de la clase no necesita modificar su código.

#include <iostream>
#include <string>
#include <utility>
#include <vector>

using std::cout; using std::endl;
using std::vector; using std::string;

class BaseClass {
public:
    BaseClass() = default;
    explicit BaseClass(string user, string nm):
             username(std::move(user)), name(std::move(nm)) { }

    ~BaseClass() = default;

    string& getUsername() { return username; };
    string& getName() { return name; };

private:
    string username;
    string name;
};

int main()
{
    BaseClass base("buddy", "Buddy Bean");

    cout << "base -> name: " << base.getName() << endl;
    cout << "base -> username: " << base.getUsername() << endl;

    exit(EXIT_SUCCESS);
}

Producción:

base -> name: Buddy Bean
base -> username: buddy

Utilice funciones public para recuperar miembros privados de una clase en C++

Los miembros private se pueden modificar usando las funciones de la interfaz de clase, por ejemplo, la función changeUsername toma el argumento string del usuario de la clase y almacena su valor en el miembro private - username. Tenga en cuenta que también hay una palabra clave friend que distingue otras clases y funciones a las que se les permite acceder a los miembros private de la clase. Estas funciones pueden ser externas, no formar parte de la clase mencionada anteriormente. Sin embargo, tenga en cuenta que el uso incorrecto de especificadores de acceso probablemente resulte en errores del compilador.

#include <iostream>
#include <string>
#include <utility>
#include <vector>

using std::cout; using std::endl;
using std::vector; using std::string;

class BaseClass {
public:
    BaseClass() = default;
    explicit BaseClass(string user, string nm):
             username(std::move(user)), name(std::move(nm)) { }

    ~BaseClass() = default;

    void changeUsername(const string &s) { username.assign(s); };

    string& getUsername() { return username; };
    string& getName() { return name; };

private:
    string username;
    string name;
};

int main()
{
    BaseClass base("buddy", "Buddy Bean");

    cout << "base -> name: " << base.getName() << endl;
    cout << "base -> username: " << base.getUsername() << endl;
    base.changeUsername("jolly");
    cout << "base -> username: " << base.getUsername() << endl;

    exit(EXIT_SUCCESS);
}

Producción:

base -> name: Buddy Bean
base -> username: buddy
base -> username: jolly

Artículo relacionado - C++ Class

  • Herencia múltiple en C++
  • Usar private vs. protected en C++