Curso de Extensão: Linguagem de Programação C++ (Básico)
Faculdade de Informática, PUCRS, Porto Alegre, RS
Coordenação: Isabel Harb Manssour
Instrutores: Eduardo Bezerra e Cristiane Woszezenki
Agregação
Agregações possibilitam definir relacionamentos do tipo "é parte de". No exemplo abaixo, retirado do apostila do “Curso de C++ por Alceu Heinke Frigeri - Bernardo Copstein - Carlos Eduardo Pereira“, é explorado um microcomputador composto de gabinete, teclado e vídeo. Cada uma dessas partes é um objeto individual. Agregadas, formam um objeto mais complexo. A definição de agregações em "C++" é feita pela definição de atributos que são objetos. Esses podem ser definidos diretamente na classe ou alocados dinamicamente a partir de atributos que são ponteiros. O que se torna relevante nesses casos é saber como se comportam as funções construtoras e como passar os parâmetros para as mesmas.
Siga esse link para o código fonte de exemplos de agregação.
Exemplo 1 – Um microcomputador com video, teclado e gabinete
#include <iostream> #include <string> #include <cstdio> class video { string marca; public: video(string); video(void); void mostra(void); }; class teclado{ string descricao; public: teclado(string); teclado(void); void mostra(void); }; class gabinete{ string cpu; public: gabinete(string); gabinete(void); void mostra(void); }; class micro{ string nome; video vid; teclado tec; gabinete gab; public: micro(string, string, string); void mostra(void); }; //---------------- Implementacao da classe video video::video(){ } video::video(string marca_video){ marca = marca_video; } void video::mostra(){ cout <<"Marca do video: " << marca << "\n"; } //----------------- Implementacao da classe teclado teclado::teclado(string tipo){ descricao = tipo; } teclado::teclado(){ } void teclado::mostra() { cout <<"Descricao do teclado: " << descricao << "\n"; } //------------------ Implementacao da classe gabinete gabinete:: gabinete(string tipo){ cpu = tipo; } gabinete:: gabinete(){ } void gabinete::mostra(){ cout <<"Tipo da cpu: " << cpu << "\n"; } // Implementacao da classe micro micro::micro(string n, string marca_video, string tipo_cpu):tec("Teclado comum - 128 teclas"), vid(marca_video), gab(tipo_cpu){ nome = n; } void micro::mostra(){ cout <<"\nDescricao do micro:" << nome << "\n"; vid.mostra(); tec.mostra(); gab.mostra(); cout <<"\n"; } // Rotina principal int main(){ micro micro1("Micro1","486 DX 66","Samsung SyncMaster3"); micro micro2("Micro2","386 DX 25","Nec MultiSync 3D"); micro1.mostra(); micro2.mostra(); getchar(); return 0; }
Exemplo 2 – Exemplo 1 reescrito com ponteiros e destrutores
#include <stdlib.h>
#include <iostream.h>
#include <string.h>
#include <stdio.h>
class video {
char marca[80];
public:
video(char *m) { strcpy(marca,m);}
~video() { printf("Destruiu o video\n"); }
void imp(void);
};
class teclado{
char descricao[100];
public:
teclado(char *descr) { strcpy(descricao,descr);}
~teclado() { printf("Destruiu teclado\n"; }
void imp(void);
};
class gabinete{
char cpu[80];
public:
gabinete(char *c) { strcpy(cpu,c); }
~gabinete() { printf(""Destruiu gabinete\n"; }
void imp(void);
};
class micro{
char nome[80];
video *vid;
teclado t;
gabinete *gab;
public:
micro(char *nome,char *tipo_cpu,char *marca_video);
~micro(void);
void imp(void);
};
// Implementacao da classe video
void video::imp(){
printf(""Marca do video: " << marca << "\n");
}
// Implementacao da classe teclado
void teclado::imp()
{
Curso de C++ por Alceu Heinke Frigeri - Bernardo Copstein - Carlos Eduardo Pereira Pg. 29
printf("Descricao do teclado: " << descricao << "\n");
}
// Implementacao da classe gabinete
void gabinete::imp(){
printf("Tipo da cpu: " << cpu << "\n");
}
// Implementacao da classe micro
micro::micro(char *n,char *tipo_cpu,char *marca_video):t("Teclado comum - 128 teclas")
{
strcpy(nome,n);
vid = new video(marca_video);
gab = new gabinete(tipo_cpu);
}
micro::~micro(){
delete vid;
delete gab;
printf(""Destruiu micro:" << nome << "\n";
}
void micro::imp(){
printf(""\nDescricao do micro:" << nome << "\n";
vid->imp();
t.imp();
gab->imp();
printf(""\n";
}
// Rotina principal
void main(){
micro *micro1;
micro micro2("Micro2","386 DX 25","Nec MultiSync 3D");
micro1 = new micro("Micro1","486 DX 66","Samsung SyncMaster3");
micro1->imp();
micro2.imp();
delete micro1;
}