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