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; }