Médio C++
Array de tamanho fixo com parâmetro não-tipo
Enunciado
Crie uma classe template ArrayFixo que recebe um tipo T e um inteiro N como parâmetros não-tipo. A classe deve ter um construtor que preenche todos os elementos com um valor padrão, um método tamanho() que retorna N, e um operador [] para acesso aos elementos. Use CTAD para criar uma instância sem especificar os parâmetros.
Requisitos
- A classe deve ter dois parâmetros de template:
typename Teint N. - O construtor deve inicializar todos os elementos com o valor fornecido.
- O método
tamanho()deve retornarN. - O operador
[]deve permitir leitura e escrita. - O
maindeve usar CTAD para criar umArrayFixoa partir de um valor e um tamanho.
Código inicial
#include <iostream>
#include <string>
template <typename T, int N>
class ArrayFixo {
// TODO
};
int main() {
// Use CTAD para criar ArrayFixo<int, 5> com valor inicial 7
// Imprima o tamanho e os elementos
return 0;
}
Saída esperada
Tamanho: 5
7 7 7 7 7
Ver dica
Declare o array como T dados[N];. No construtor, use um loop para preencher. O operador [] retorna referência.
Mostrar solução
#include <iostream>
template <typename T, int N>
class ArrayFixo {
T dados[N];
public:
ArrayFixo(const T& valor) {
for (int i = 0; i < N; ++i) dados[i] = valor;
}
int tamanho() const { return N; }
T& operator[](int i) { return dados[i]; }
const T& operator[](int i) const { return dados[i]; }
};
int main() {
ArrayFixo<int, 5> arr(7);
std::cout << "Tamanho: " << arr.tamanho() << '\n';
for (int i = 0; i < arr.tamanho(); ++i)
std::cout << arr[i] << ' ';
std::cout << '\n';
return 0;
}
Passo a passo
- Declaramos
ArrayFixocom dois parâmetros:typename Teint N. - O membro
dadosé um array deTcom tamanhoN. - O construtor recebe um valor e preenche todos os elementos.
tamanho()retornaN.- O operador
[]permite acesso indexado, com versão const e não-const. - No
main, criamosArrayFixo<int, 5>e usamos os métodos.
Por que funciona
O parâmetro não-tipo N é conhecido em tempo de compilação, permitindo alocar o array como membro. O template gera uma classe específica para int e 5. O operador [] retorna referência, permitindo modificar os elementos.
Erros comuns
- Usar
Ncomo variável de runtime: não compila, poisNdeve ser constante. - Esquecer a versão
constdo operador[]: não é erro, mas impede acesso a objetos const. - Não inicializar o array no construtor: valores indefinidos.
Outra forma de resolver
Usar std::array<T, N>, que já oferece tudo isso. Preferível por ser padrão e seguro.
Saída esperada
Tamanho: 5
7 7 7 7 7