Getters e Setters
Parte da seção Programação Orientada a Objetos do Journey de C++ da Coddy — lição 28 de 104.
Quando os membros de uma classe são privados, o código externo não pode acessá-los diretamente. Getters e setters são métodos públicos que fornecem acesso controlado a esses membros privados - getters recuperam valores, setters os modificam.
class Temperature {
double celsius; // Privado - não pode ser acessado diretamente
public:
// Getter - retorna o valor
double getCelsius() const {
return celsius;
}
// Setter - modifica o valor com validação
void setCelsius(double value) {
if (value >= -273.15) { // Verificação de zero absoluto
celsius = value;
}
}
};O verdadeiro poder dos setters é a validação.
Em vez de permitir que qualquer valor seja atribuído, você pode aplicar regras. No exemplo acima, temperaturas abaixo do zero absoluto são rejeitadas. Sem um setter, qualquer pessoa poderia atribuir dados inválidos diretamente.
Getters também podem transformar dados antes de retorná-los:
class Temperature {
double celsius;
public:
double getCelsius() const { return celsius; }
// Computed getter - doesn't store fahrenheit, calculates it
double getFahrenheit() const {
return celsius * 9.0 / 5.0 + 32.0;
}
void setCelsius(double value) { celsius = value; }
};Observe a palavra-chave const nos getters - isso indica que eles não modificam o objeto. Setters não podem ser const, já que seu propósito é alterar os valores dos membros. Este padrão de uso de getters e setters é fundamental para o encapsulamento, oferecendo controle total sobre como os dados da sua classe são acessados e modificados.
Desafio
FácilVamos construir um sistema de perfil de jogador que demonstra como getters e setters fornecem acesso controlado a dados privados, incluindo validação e propriedades computadas.
Você criará dois arquivos para organizar seu código:
Player.h: Defina uma classePlayerque gerencia o perfil de um personagem de jogo com acesso a dados protegidos. Sua classe deve ter:- Membros privados:
name(string),level(int), eexperience(int) - Um construtor que recebe um nome e inicializa
levelcomo1eexperiencecomo0 - Um getter
getName()que retorna o nome do jogador - Um getter
getLevel()que retorna o nível atual - Um getter
getExperience()que retorna os pontos de experiência atuais - Um setter
setName()que aceita apenas nomes com pelo menos 3 caracteres — se for inválido, mantenha o nome atual inalterado - Um setter
addExperience(int points)que aceita apenas valores positivos. Quando a experiência atinge ou excede100, o jogador sobe de nível: incremente o nível em 1 e subtraia 100 da experiência. Isso pode acontecer várias vezes se experiência suficiente for adicionada. - Um getter computado
getExperienceToNextLevel()que retorna quantos pontos de experiência a mais são necessários para atingir o próximo nível (sempre100 - current experience)
Marque todos os getters como
const, pois eles não modificam o objeto.- Membros privados:
main.cpp: Demonstre seus getters e setters em ação. Leia um nome de jogador e pontos de experiência para adicionar da entrada (cada um em uma linha separada), então:- Crie um
Playercom o nome de entrada - Imprima
"Player: <name>, Level: <level>, XP: <experience>" - Adicione os pontos de experiência de entrada usando
addExperience() - Imprima a mesma linha de status novamente para mostrar o estado atualizado
- Imprima
"XP to next level: <amount>" - Tente alterar o nome para
"Al"(deve falhar na validação) - Imprima
"Name after invalid change: <name>" - Altere o nome para
"Champion"(deve ter sucesso) - Imprima
"Name after valid change: <name>"
- Crie um
A entrada de experiência será fornecida como uma string que você precisará converter para um inteiro. Inclua seu arquivo de cabeçalho no main.cpp usando #include "Player.h".
Folha de consulta
Getters e setters são métodos públicos que fornecem acesso controlado a membros privados de uma classe.
Padrão básico de getter e setter:
class Temperature {
double celsius; // Membro privado
public:
// Getter - retorna o valor (marcado como const)
double getCelsius() const {
return celsius;
}
// Setter - modifica o valor
void setCelsius(double value) {
celsius = value;
}
};Setters com validação:
void setCelsius(double value) {
if (value >= -273.15) { // Valida antes de definir
celsius = value;
}
}Getters computados:
// Retorna o valor calculado sem armazená-lo
double getFahrenheit() const {
return celsius * 9.0 / 5.0 + 32.0;
}Pontos-chave:
- Getters devem ser marcados como
const, pois não modificam o objeto - Setters não podem ser
const, pois alteram os valores dos membros - Setters permitem a validação para evitar dados inválidos
- Getters podem transformar ou computar valores antes de retorná-los
Experimente você mesmo
#include <iostream>
#include <string>
#include "Player.h"
using namespace std;
int main() {
// Ler o nome do jogador
string playerName;
getline(cin, playerName);
// Ler os pontos de experiência a adicionar (como string, converter para int)
string expString;
getline(cin, expString);
int expToAdd = stoi(expString);
// TODO: Criar um Player com o nome de entrada
// TODO: Imprimir o status inicial: "Player: <name>, Level: <level>, XP: <experience>"
// TODO: Adicionar os pontos de experiência de entrada usando addExperience()
// TODO: Imprimir a linha de status atualizada
// TODO: Imprimir "XP to next level: <amount>"
// TODO: Tentar alterar o nome para "Al" (deve falhar na validação)
// TODO: Imprimir "Name after invalid change: <name>"
// TODO: Alterar o nome para "Champion" (deve ter sucesso)
// TODO: Imprimir "Name after valid change: <name>"
return 0;
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos de OOP
Arquivos ExternosBuild e Compilação em C++Arquivos Header e SourceNamespaces e EscopoIntrodução a OOP em C++Classes vs ObjetosO Ponteiro 'this'Métodos (Funções Membro)Atributos (Membros de Dados)Básico de Ctors e DtorsRecapitulação - Calculadora Simples4Propriedades de Classe
Membros de Instância vs EstáticosGetters e SettersFunções de Membro ConstPalavra-chave MutableMétodos e Variáveis EstáticosFunções e Classes FriendRecapitulação - Gerenciador de Conta Bancária7Herança
Herança BásicaNíveis de Acesso na HerançaOrdem de Chamada de Ctor e DtorSobrescrita de MétodosFunções Virtuais e VTableHerança MúltiplaHerança VirtualRecapitulação - Hierarquia de Funcionários2Gerenciamento de Memória
Memória Stack vs HeapPonteiros e ReferênciasMemória Dinâmica (new/delete)Smart Pointers em C++RAII em C++Recapitulação - Gerenciador de Array Dinâmico5Encapsulamento
Especificadores de Acesso em C++Especificadores de Acesso em DetalhesOcultação de InformaçãoStruct vs ClassClasses Aninhadas e InternasRecapitulação - Sistema de Registros de Alunos8Polimorfismo
Polimorfismo de Compilação vs Tempo de ExecuçãoSobrecarga de FunçõesFunções Virtuais RevisitadasFunções Virtuais PurasClasses AbstratasDesign de Interfaces em C++Dynamic Casting e RTTIRecapitulação - Calculadora de Formas3Construtores e Destrutores
Construtor PadrãoConstrutor ParametrizadoConstrutor de CópiaConstrutor de MovimentaçãoListas de Inicialização do ConstrutorConstrutores DelegadosMergulho Profundo em DestrutoresRegra dos Três / Cinco / ZeroRecapitulação - Classe String6Sobrecarga de Operadores
Introdução à Sobrecarga de OperadoresSobrecarga de Operadores AritméticosSobrecarga de Operadores de ComparaçãoOperadores de StreamSobrecarga do Operador de AtribuiçãoSobrecarga dos Operadores [] e ()Operadores de Conversão de TipoRecapitulação - Classe Matrix9Templates
Templates de FunçãoTemplates de ClasseEspecialização de TemplatesTemplates VariádicosFundamentos de SFINAE e Type TraitsRecapitulação - Container Genérico