Revisão - Gerenciador de Array Dinâmico
Parte da seção Programação Orientada a Objetos do Journey de C++ da Coddy. Lição 17 de 104.
Desafio
FácilVamos criar uma classe DynamicArray que gerencia sua própria memória, crescendo automaticamente quando necessário, assim como std::vector funciona internamente!
Você criará dois arquivos para organizar seu código:
DynamicArray.h: Defina uma classeDynamicArrayque gerencia um array de inteiros de tamanho dinâmico. Sua classe deve ter:- Membros privados: um ponteiro para o array de dados, o tamanho atual (número de elementos) e a capacidade (espaço alocado)
- Um construtor que recebe uma capacidade inicial, aloca o array no heap e inicializa o tamanho como 0
- Um destrutor que libera a memória alocada e imprime
"DynamicArray destroyed" - Um método
push(int value)que adiciona um elemento ao array. Se o array estiver cheio, ele deverá dobrar a capacidade alocando um novo array maior, copiando os elementos existentes e liberando o array antigo - Um método
get(size_t index)que retorna o elemento no índice fornecido - Um método
getSize()que retorna o número atual de elementos - Um método
getCapacity()que retorna a capacidade atual
main.cpp: Leia uma capacidade inicial e uma quantidade de valores a serem adicionados. Em seguida, leia essa quantidade de valores inteiros e insira cada um deles no seu DynamicArray. Depois de adicionar todos os valores, imprima:"Size: <size>""Capacity: <capacity>""Elements: <e1> <e2> ..."(todos os elementos separados por espaços)
O formato da entrada será:
- Primeira linha: capacidade inicial (inteiro)
- Segunda linha: número de valores a adicionar (inteiro)
- Linhas seguintes: um valor inteiro por linha
Ao redimensionar, seu array deverá dobrar a capacidade. Por exemplo, se você começar com capacidade 2 e inserir um terceiro elemento, a capacidade deverá passar a ser 4. Isso demonstra o princípio de RAII. Sua classe adquire memória no construtor e a libera no destrutor, garantindo que não haja vazamentos de memória.
Inclua seu arquivo de cabeçalho em main.cpp usando #include "DynamicArray.h".
Experimente você mesmo
#include <iostream>
#include "DynamicArray.h"
using namespace std;
int main() {
// Ler a capacidade inicial
int initialCapacity;
cin >> initialCapacity;
// Ler o número de valores a adicionar
int numValues;
cin >> numValues;
// TODO: Create a DynamicArray with the initial capacity
// TODO: Ler numValues inteiros e inserir cada um no array
// TODO: Imprimir "Size: <size>"
// TODO: Imprimir "Capacity: <capacity>"
// TODO: Imprimir "Elements: <e1> <e2> ..." (todos os elementos separados por espaços)
return 0;
}
Todas as lições de Programação Orientada a Objetos
1Fundamentos de POO
Arquivos externosBuild e compilação em C++Arquivos de cabeçalho e arquivos-fonteNamespaces e escopoIntrodução à POO em C++Classes vs. objetosO ponteiro 'this'Métodos (funções membro)Atributos (membros de dados)Noções básicas de construtores e destruidoresRevisão - calculadora simples4Propriedades de Classe
Membros de Instância vs. EstáticosGetters e SettersFunções Membro ConstPalavra-chave MutableMétodos e Variáveis EstáticosFunções e Classes FriendRevisão - Gerenciador de Contas Bancárias7Herança
Herança básicaNíveis de acesso da herançaOrdem de chamada de construtor e destrutorSobrescrita de métodosFunções virtuais e VTableHerança múltiplaHerança virtualRevisão - Hierarquia de funcionários10Visão geral da STL
Visão geral e filosofia da STLContêineres da STLIteradoresAlgoritmos da STLFunctors e expressões lambdaRecapitulação - Frequência de palavras13Padrões de Projeto — Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonFactory e Abstract FactoryPadrão BuilderPadrão ObserverPadrão Strategy2Gerenciamento de Memória
Memória Stack vs. HeapPonteiros e ReferênciasMemória Dinâmica (new/delete)Ponteiros Inteligentes em C++RAII em C++Revisão - Gerenciador de Array Dinâmico5Encapsulamento
Especificadores de acesso em C++Especificadores de acesso em profundidadeOcultação de informaçõesStruct vs ClasseClasses aninhadas e internasRecapitulação - Sistema de registros de alunos8Polimorfismo
Polimorfismo em compilação vs. execuçãoSobrecarga de funçõesFunções virtuais revisadasFunções virtuais purasClasses abstratasDesign de interfaces em C++Conversão dinâmica e RTTIRecapitulação — Calculadora de formas11Conceitos Avançados de OOP
Composição vs. HerançaMixins via CRTPIdioma PimplApagamento de TiposClasses Enum e Tipagem ForteTratamento de Exceções em OOPHierarquias de Exceções Personalizadas14Padrões de Projeto — Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositeRAII como Padrão3Construtores e Destrutores
Construtor PadrãoConstrutor ParametrizadoConstrutor de CópiaConstrutor de MovimentoListas de Inicialização do ConstrutorConstrutores DelegantesAprofundamento em DestrutoresRegra dos Três / Cinco / ZeroRevisão - Classe String6Sobrecarga de Operadores
Introdução à Sobrecarga de OperadoresSobrecarga de Operadores AritméticosSobrecarga de Operadores de ComparaçãoOperadores de FluxoSobrecarga do Operador de AtribuiçãoSobrecarga dos Operadores [] e ()Operadores de Conversão de TipoRecapitulação - Classe Matrix9Templates
Templates de FunçõesTemplates de ClassesEspecialização de TemplatesTemplates VariádicosNoções Básicas de SFINAE e Traits de TiposRecapitulação - Contêiner GenéricoPratique por conta própria: Compilador de C++ online