Mandar um cafézinho para o programador:


Me ajude a transformar café em código!

Array de Objetos em C++

 Neste tutorial de nosso livro de C++, vamos aprender a criar um array de objetos, bem como manipulá-los.

Criando um array com Objetos em C++

No tutorial passado, criamos uma classe que calculava médias de duas ou três notas, de estudantes. Vamos fazer algo parecido neste tutorial.

Vamos criar a classe Student, e inicialmente ela recebe duas notas. A função construtora seta corretamente as variáveis, e tem uma função chamada getAverage() que retorna a média das duas notas:

#include <iostream>
using namespace std;
class Student
{
    private:
        double grade1, grade2;

    public:
        Student();
        Student(double, double);
        double getAverage();
};

Student::Student()
{
    grade1 = 0;
    grade2 = 0;
}
double Student::getAverage() { return (grade1+grade2)/2; } int main() { Student NeilPeart(10, 8); cout<<NeilPeart.getAverage()<<endl; return 0; }

Note que criamos apenas um objeto, o aluno Neil Peart. Mas que escola tem apenas um aluno? Tem milhares, mas vamos com calma. Vamos trabalhar agora com 5 alunos. Poderíamos fazer:

  • Student alu1, alu2, alu3, alu4, alu5;

Mas, e se fosse um projeto real, com mil alunos? Ia fazer até o alu1000?
Claro que não, né, mané!

Você estudou pelo C++ Progressivo, é uma pessoa esperta e vai logo se lembrar dos nossos amados e queridos arrays, para se trabalhar com muitas variáveis ao mesmo tempo.

Para declarar 5 inteiros, fazemos:

int num[5];

Para declarar 5 chars, fazemos:
char letter[5];

Então adivinha só o que fazemos pra criar 5 objetos da classe Student? Isso mesmo:

  • Student alu[5];
Array de Objetos em C++

Rode o código o código abaixo:

#include <iostream>
using namespace std;

class Student
{
    private:
        double grade1, grade2;

    public:
        Student();
        Student(double, double);
        double getAverage();
};

Student::Student()
{
    grade1 = 0;
    grade2 = 0;
}

Student::Student(double g1, double g2)
{
    grade1 = g1;
    grade2 = g2;
}

double Student::getAverage()
{
    return (grade1+grade2)/2;
}


int main()
{
    Student alu[5];
    cout<<alu[0].getAverage()<<endl;

    return 0;
}

O resultado vai ser 0, pois não inicializamos os objetos do array.

Como inicializar Objetos de um Array

Poderíamos inicializar os objetos um por um, depois de declarar:

    Student alu[5];
    alu[0] = Student(10,9);
    alu[1] = Student(10,8);
    alu[2] = Student(10,7);
    alu[3] = Student(10,6);
    alu[4] = Student(10,5);

Ou poderíamos inicializar logo tudo na hora de instanciar os objetos:
    Student alu[5] = { Student(10,9),
                       Student(10,8),
                       Student(10,7),
                       Student(10,6),
                       Student(10,5) };
Ou até diretamente:
    Student alu[5] = { {10,9},
                       {10,8},
                       {10,7},
                       {10,6},
                       {10,5} };
Se você tiver outras funções construtoras (que recebam uma nota ou 3, por exemplo), também pode colocar diretamente no código, o C++ vai saber chamar a construtor correta. E se você não fornecer nenhuma informação de algum elemento do array, o C++ vai invocar o construtor padrão (é sempre bom ter um, na classe).

Como acessar membros do Array de Objetos

Ok, já declaramos e inicializamos vários objetos de uma vez só, agora precisa aprender a acessar seus membros.

Quando tínhamos um objeto de nome 'name', acessávamos seus membros usando ponto:
  • name.var
  • name.func()

Aqui é a mesma coisa, mas a variável é um elemento de array:
  • arr[0].grade
  • arr[1].getAverage();
Ou seja, mesma coisa, só usar o array bonitinho e o pontinho, seguido do membro da classe/objeto.
O programa a seguir cria 5 objetos, já inicializa com a nota dos alunos e exibe suas médias com a função getAverage():
#include <iostream>
using namespace std;

class Student
{
    private:
        double grade1, grade2;

    public:
        Student();
        Student(double, double);
        double getAverage();
};

Student::Student()
{
    grade1 = 0;
    grade2 = 0;
}

Student::Student(double g1, double g2)
{
    grade1 = g1;
    grade2 = g2;
}

double Student::getAverage()
{
    return (grade1+grade2)/2;
}


int main()
{
    Student alu[5] = { {10,9},
                       {10,8},
                       {10,6},
                       {10,5} };


    cout<<alu[0].getAverage()<<endl;
    cout<<alu[1].getAverage()<<endl;
    cout<<alu[2].getAverage()<<endl;
    cout<<alu[3].getAverage()<<endl;
    cout<<alu[4].getAverage()<<endl;

    return 0;
}
Note que inicializamos apenas os quatro primeiros alunos, então o quinto foi inicializado pelo construtor padrão. Qual foi a média do quinto aluno (alu[4])?

Agora faça outro teste: crie uma classe, que apenas tem o construtor padrão, exibindo uma mensagem na tela. Crie um array de tamanho 10, desses objetos. O que acontece?

2 comentários:

  1. Como eu faria para acessar os objetos dentro de uma função?

    ResponderExcluir
  2. Como faço para criar um método que acessa os atributos de todos os objetos do array?

    ResponderExcluir

Ajude o C++ Progressivo

Que tal apoiar e fazer crescer o ensino da programação no Brasil ?

Ajudar nosso país a crescer e se desenvolver cada vez mais, tecnologicamente?

Clica abaixo pra saber mais!

Apoiar o Projeto Progressivo