Menu
Coddy logo textTech

Struct vs Classe

Parte da seção Programação Orientada a Objetos do Journey de C++ da Coddy. Lição 37 de 104.

Em C++, struct e class são quase idênticos. Ambos podem ter variáveis-membro, funções-membro, construtores e oferecer suporte à herança. A única diferença é o nível de acesso padrão.

Em uma class, os membros são privados por padrão. Em uma struct, os membros são públicos por padrão:

struct Point {
    int x;    // público por padrão
    int y;    // público por padrão
};

class Circle {
    double radius;    // privado por padrão
    
public:
    double getRadius() { return radius; }
};

Isso também se aplica à herança. Uma struct herda publicamente por padrão, enquanto uma classe herda privadamente:

struct DerivedStruct : Base {};    // herança pública
class DerivedClass : Base {};      // herança privada

Além desses default, não há diferença técnica. No entanto, a convenção é importante.

A maioria dos programadores de C++ usa struct para contêineres simples de dados com membros públicos (como uma coordenada ou configuração) e class quando o encapsulamento e o comportamento são importantes. Seguir essa convenção torna mais clara a intenção do seu código para outros desenvolvedores.

challenge icon

Desafio

Fácil

Vamos criar um sistema simples de configuração que demonstra quando usar struct em vez de class com base nas convenções de C++. Você criará uma struct para dados simples que devem ser acessíveis diretamente e uma class para dados que precisam de encapsulamento e acesso controlado.

Você criará dois arquivos para organizar seu código:

  • Config.h: defina uma struct e uma class que representem diferentes tipos de dados de configuração.

    Primeiro, crie uma struct chamada Dimensions: um contêiner de dados simples para largura e altura (ambas int). Como os membros de structs são públicos por padrão, eles devem ser acessíveis diretamente, sem getters. Inclua um método area() que retorne o produto da largura pela altura.

    Em seguida, crie uma class chamada AppConfig que gerencie as configurações do aplicativo com o encapsulamento adequado. Ela deve armazenar um nome de aplicativo (string) e um objeto Dimensions para o tamanho da janela. Como os membros de classes são privados por padrão, você precisará tornar explicitamente sua interface pública acessível. Forneça:

    • Um construtor que receba o nome do aplicativo, a largura e a altura
    • Um getter getAppName() que retorne o nome
    • Um getter getWindowSize() que retorne o Dimensions
    • Um método displayConfig() que imprima: "App: <name>, Window: <width>x<height>, Area: <area>"
  • main.cpp: demonstre a diferença entre o uso de struct e class. Leia um nome de aplicativo, a largura e a altura da entrada (três linhas separadas) e então:
    • Crie uma Dimensions struct diretamente com os valores de largura e altura: acesse seus membros diretamente para imprimir: "Direct struct access: <width> x <height>"
    • Crie um objeto AppConfig com os três valores
    • Chame displayConfig() para mostrar a configuração completa
    • Use o getter para obter as dimensões da janela e imprimir: "Via getter - Area: <area>"

Este desafio destaca a convenção: use struct quando tiver dados simples e transparentes (como coordenadas ou dimensões) e use class quando quiser controlar o acesso e adicionar comportamento aos seus dados.

Converta as entradas de largura e altura de strings para inteiros usando std::stoi(). Não se esqueça das guardas de cabeçalho no seu arquivo de cabeçalho.

Experimente você mesmo

#include <iostream>
#include <string>
#include "Config.h"

using namespace std;

int main() {
    // Ler entrada
    string appName;
    string widthStr;
    string heightStr;
    
    getline(cin, appName);
    getline(cin, widthStr);
    getline(cin, heightStr);
    
    int width = stoi(widthStr);
    int height = stoi(heightStr);
    
    // TODO: Crie uma struct Dimensions com width e height
    // Access its members directly to print: "Direct struct access: <width> x <height>"
    
    // TODO: Crie um objeto AppConfig com appName, width e height
    
    // TODO: Chame displayConfig() no objeto AppConfig
    
    // TODO: Use getWindowSize() getter to get dimensions and print: "Via getter - Area: <area>"
    
    return 0;
}
quiz iconTeste seus conhecimentos

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

Pratique por conta própria: Compilador de C++ online