Observação técnica feita,
vamos avançar um pouquinho mais.
Até agora, a gente entendeu, então, uma coisa interessante.
A gente percebeu que a gente tem o ObjetoPrincipal,
que é o nosso mundo.
Nesse ObjetoPrincipal, eu tenho os objetinhos menores
que são as coisas que eu tô trabalhando ali no,
numa espécie de sistema, né,
primário ainda, mas um sistema pra gente entender alguns conceitos
fundamentais à orientação a objetos.
Então, o ObjetoPrincipal
ele agrega fortemente, ou ele se compõe,
do objeto Simao, do objeto Einstein, do objeto Newton
até do objeto diaAtual, mesAtual, anoAtual que são da classe inteiro
esses últimos três.
Bom, então tem esse relacionamento todo-parte, né.
E é natural que seja assim, tá.
O mundo orientado a objetos
ele respeita muito o relacionamento todo-parte
Você pega, por exemplo, um carro
é típico relacionamento todo-parte.
O carro vai se compor da lataria, do chassi, do motor.
O motor, por sua vez, vai se compor
de pistão, de câmara de combustão,
de bomba de gasolina, de carburador,
de vela, de válvula e disso e daquilo.
Pode ser que algum desses componentes sejam auto-contidos,
já seja um objeto raiz
ou ele seja também composição de outros objetos.
Então, depende do que você tá... do objeto que você tá olhando.
mas é muito natural essa relação todo-parte.
Então, o ObjetoPrincipal se compõe de outros objetos.
Só que, não são
na natureza, as coisas não se definem só por composição.
Também existe associação, por exemplo:
a lataria, o chassi e o motor
que estão... que compõe o carro,
eles três se relacionam entre si.
Eles precisam se relacionar de alguma forma
pra alcançar o objetivo do carro.
O motor, por exemplo, vai se relacionar,
de alguma forma, através até por meio de outros objetos,
pra movimentar o chassi.
Então, as relações dos objetos do mundo real além
de agregação, elas possuem outras formas.
Uma forma que é destacada, aqui nesse momento, é a associação.
Então, por exemplo, nós estamos todos agregados, aqui, ao planeta Terra.
Conforme as condições, também está agregado ao nosso país.
Agora, você também tem, dentro desse ambiente que você tá agregado,
você tem relações com outros objetos.
Por exemplo, você tem relações de amizades, você tem vários amigos,
essas relações de amizade,
de coleguismo, elas se chamam associações.
O motor vai se associar com o sistema de engrenagens.
Então, isso é uma associação, não é uma agregação.
Motor não o sistema de engrenagens,
o sistema de engrenagens não têm o motor.
mas eles se associam através de algum tipo de interface.
Como é que isso acontece em software?
Bom, dá pra fazer um exercício, aqui,
e através desse exercício eu trago,
de maneira bastante prática, né,
como fazer uma associação, aí,
em C++, entre objetos no C++.
Criar uma classe chamada Universidade que terá como atributo um nome.
Se vocês quiserem vocês até podem até...
cancelar não, mas pausar o vídeo
fazer esse exercício, tá, porque isso aqui já deve ser intuitivo
pra vocês criar uma classe com atributo nome,
que vai ter uma construtora, uma destrutora,
provavelmente um informaNome(), ou algo assim.
O próximo tópico diz o seguinte:
Relacionar ou associar a classe Pessoa
para com a classe Universidade.
Cada objeto da classe Pessoa, poderá ser associado ao objeto da...
a um objeto da classe Universidade.
Aí ele já traz uma observação técnica, né,
no item ali embaixo, que é: A classe pessoa
terá um ponteiro para um objeto
ou "variável" da classe Universidade.
Aqui ele já deu a dica, tá.
Associação a gente vai usar ponteiros pra...
fazer isso em C++, tá.
Trata associação em ponteiro...
a gente trata associações, em C++, via ponteiro, muito embora existam outras formas.
A classe Pessoa, por sua vez,
terá uma função-membro, isto é, um método,
que permitirá a cada objeto de Pessoa
informar seu nome e em que universidade trabalha.
Mas como que ela vai informar em qual universidade trabalha?
Através da associação que ela vai ter com Universidade, justamente.
Imaginem que você tenha, sei lá,
uma empresa, você tem um sócio, lá, o Fulano.
Aí, você diz...
chega lá o pessoal da Receita Federal e
quer pegar informações de empresa, lá, pra fins de cadastro, sei lá eu.
Aí, pergunta: oh, Ciclano,
qual teu CPF? Você informa teu CPF.
E qual o do Fulano? O do Fulano você não sabe.
Mas se você tem uma associação com ele, você diz: oh, fulano, qual é teu CPF aí?
Aí ele vai informar pra você,
através do relacionamento de associação.
Isso acontece aqui, tá.
A Pessoa vai informar o seu nome e também vai
pedir pra Universidade informar o nome dela.
Assim, ela vai contar, que ela fulano de tal trabalha para tal universidade.
Isso fica mais entendível na hora que a gente olha o código.
Bom, vamos resolver o primeiro tópico,
que é ali: Criar uma classe chamada Universidade que terá como atributo um nome.
Tá aqui a construção da classe Universidade.
Abre chaves, fecha chaves.
Olha o ponto e vírgula nosso, está aqui.
Tá aqui, um atributo que vai ser um vetor de caracteres.
Tá aqui, uma construtora, com um parâmetro, com um valor default.
Opa, alto lá, professor, cadê a construtora sem parâmetro?
Justamente.
Aqui eu tenho uma equivalente à sem parâmetro.
Se eu tenho uma construtora,
cujo, todos os parâmetros, têm valor default,
então, ela faz a vez da construtora sem parâmetro.
Aqui, no caso, eu tenho um parâmetro que tem valor default,
assim, se eu chamar a construtora sem parâmetro... se...
se o compilador tentar chamar a construtora,
de maneira automática
que o compilador tem essa habilidade em alguns momentos, como vocês já viram,
ele vai chamar a Universidade com n
passando ele como valor default.
Inclusive, o n alimenta o nome, aqui, através do strcpy().
Tenho a destrutora, vazia por assim dizer, né.
Aqui, eu tenho uma função getNome() que seria o equivalente a um informaNome().
É muito usual, o pessoal que programa,
em C++, usar o termo get
em vez de chamar informaNome()
eles vão chamar de getNome() mesmo que o programa esteja em português,
que é o caso ali.
Parece estranho, mas é um modismo que ficou e é assim.
Assim como eu posso ter um getNome(), que pode retornar o nome,
inclusive, eu posso fazer alguma...
tratamento aqui dentro se eu quiser, tá,
do ponto de vista da privacidade do objeto,
por exemplo, retornar aqui
apresento no tratamento só o sobrenome não o nome inteiro.
se assim eu quiser.
Eu tenho, também aqui, um setNome()
que seria o equivalente a um colocaNome(),
a setagem, né, coloca o nome,
ou ponha o nome.
Então, quando o setNome() recebe um valor, ele vai repassar pro nome.
Mas aqui, ó, nada impede de eu fazer algum tratamento também ali, ó.
Por exemplo, colocar todos os caracteres em maiúsculo,
fazer através de funções do string.h,
põe tudo em maiúsculo e armazeno ali.
É por isso que tem set e get, inclusive.
Então, sempre que você... pra uma variável
se precisar recuperar a informação dela,
você vai ter um getNome().
Lá na classe Pessoa,
aquele informaIdade() podia chamar getIdade(), bem entendido.
Se eu quiser colocar uma informação num atributo,
no nome do objeto eu vou ter então,
ter criado uma função set pertinente, eu 'setando' lá.
Isso é importante.
Outra coisa que vocês notam aqui,
nessa classe, dividida em .h e .cpp,
é que você tem aqui no .h
esses códigos em verde aqui.
Sustenido (#), se não foi definido
o elemento Universidade.h, defina o elemento Universidade.h,
e termina aqui
esse código relativo ao sustenido (#).
O que significa?
Significa o seguinte, tá.
Isso aqui é um cabeçalho de pré-processamento.
Isso aqui evita,
esse tipo de código evita, que
do seu código executável final
haja repetições de várias inclusões
desse código de maneira repetitiva
lá no seu código binário, em última instância.
Você sabe que você vai,
no teu código, varias vezes... poder chamar .h's
Por exemplo, em vários momentos do seu código, você faz lá,
um #include ,
#include ,
quem não usa um concentrador externo como o standard affixment,
não raro, acaba
chamando essas bibliotecas externas em vários pontos do código.
A título de exemplo, math.h,
math.h eu posso chamar lá em 10 .cpp's.
Aqui, no nosso Universidade.h,
pode ser que eu includa o Universidade.h em vários momentos no meu código
pra evitar que o meu binário tenha dez,
o equivalente a dez classes de Universidade lá no binário,
esse código garante
que ele só vai incluir uma classe no meu sistema
e vai compartilhar essa classe
pra gerar os objetos apropriados.
Serve pra... para tratar include's repetitivos, né.
Serve pra evitar, então,
no sentido de, evitar várias inclusões.
Essa aqui é uma versão mais antiga, tá, de...
cabeçalho de processamento, diretivo de pré-compilação,
a versão mais moderna é essa aqui, tá.
pragma once.
Isso faz o mesmo efeito,
mais bonitinho, mais clean, mais limpo.
As vezes por reflexo, tá,
inércia cognitiva, eu vou usar assim,
mas eu aconselho usar assado.
Inclusive, se você olhar lá o standard affixment,
que a gente olhou no ambiente Visual Studio
ele já usava, lá, o pragma once.
Bom, o fato é que a gente venceu aqui, então
aquela parte do exercício que era relativo
à construção da classe Universidade
aproveitando pra explicar algumas coisinhas a mais,
como sempre, em relação ao
C++.
Para ir pra segunda parte
fazer com que a Pessoa seja capaz de se relacionar com Universidade
a gente vai modificar a classe Pessoa.
Veja que a classe Pessoa agora,
ela tem um pUnivFiliado
que é um ponteiro de Universidade.
Pessoal, pragmaticamente falando,
é isso aqui que permite criar a associação.
Então, eu tenho um ponteiro Universidade
que eu chamo de pUnivFiliado.
Aqui eu tenho um set,
um cara que permite eu que vai vir aqui,
trazer um parâmetro pro endereço
armazenar o que vai vir aqui
lá pra aquele ponteiro, um ponteiro privado.
Então tá aqui setUnivFiliado(), ó.
Eu recebo um endereço de ponteiro por parâmetro,
e armazeno esse ponteiro dentro
do ponteiro pertinente
que não é um ponteiro temporário igual esse aqui
o ponteiro temporário carrega o endereço
esse endereço é armazenado mais efetivamente
dentro do pUnivFiliado.
Bom, e aqui eu tenho uma função chamada OndeTrabalho().
No OndeTrabalho() acontece o seguinte
Fulano de tal, nomeP,
sei lá eu, Jean Simão,
trabalha para
aqui ele vai chamar a função getNome()
do objeto que estiver apontado em pUnivFiliado.
Imagine no meu Principal...
não precisa imaginar, vou colocar no próximo slide aqui.
No Principal, eu tenho lá,
o Simao que é do tipo Pessoa,
e tenho UTFPR que é do tipo Universidade.
Legal.
Agora eu tenho o quê lá?
Tenho inicialização de Simao em Principal,
que não tá... as construtoras estão todas sendo chamadas implicitamente.
A gente sabe que pode melhorar isso, tá, mas enfim.
Inicializo o Simao.
coloco o nome na UTFPR,
porque UTFPR tem o setNome(),
e agora eu tô chamando o Simao.setUnivFiliado()
com o endereço de UTFPR.
O que acontece aqui?
É que eu pegar esse endereço,
que vai ser temporariamente armazenado numa variável... parâmetro.
e vou jogar isso pro pUnivFiliado
através da função setUnivFiliado
Então, depois dessa execução acontece,
em termos mais de objetos,
o seguinte, tá.
A partir desse momento aí da Principal,
eu faço Simao, lá no pUnivFiliado dele,
apontar pra UTFPR.
Aqui tem uma conexão entre Simao e UTFPR,
justamente, porque o Simao aponta pra UTFPR
e guarda lá o endereço da UTFPR.
Isso considerado,
o que acontece aqui nessa execução?
De OndeTrabalho(), aqui, ó, na Principal?
Vai acontecer o seguinte,
voltando aqui um pouquinho,
Simao é do tipo Pessoa,
então eu faço Simao pôr onde trabalha e chamo essa...
esse tipo de função aqui:
Jean Simão trabalha para
ele vai chamar a função getNome()
do cara apontado por pUnivFiliado no âmbito do Simão.
Quem que é o cara apontado por pUnivFiliado no âmbito do Simao?
O Simao vai receber lá no...
sim, o Simao recebeu lá, através do setUnivFiliado
o endereço da UTFPR,
então ele vai ter armazenado em si
o endereço da UTFPR.
que é pra ele poder chamar a partir daqui o nome da UTFPR.
Então, na prática, ele vai imprimir: Jean Simão trabalha para
o que tiver no campo nome de pUnivFiliado,
UTFPR, no caso.
É estranho inclusive UTFPR, podia estar string
por extenso Universidade Tecnológica Federal do Paraná.
Muito bem.
É que é muito legal, porque se parar pra pensar
a função OndeTrabalho() ele...
o próprio objeto imprime parte do...
faz parte do serviço, informando seu nome,
mas a outra parte do serviço, ele pede pra um objeto associado.
Então, pra executar o OndeTrabalho(), tem um colaboração de objetos aqui.
Eu tenho uma colaboração singela, mas tenho.
Olha lá, ó.
Novamente, UTFPR é de Universidade e Simao é do tipo Pessoa.
Simao.Inicializa(), coloco um nome na UTFPR,
insisto, podia optar por extenso aqui, tá.
se o nome comportar em termos de caracteres, bem entendido.
Aqui eu coloco a conexão do objeto Simao
para com o objeto UTFPR,
fazendo com que o Simao armazene lá um ponteiro
pra UTFPR por meio do setUnivFiliado.
Já discutido.
Agora, a hora que, em algum momento, eu chamo executar,
momento esse, aqui, inclusive,
eu venho aqui, ó, dizer Simao.OndeTrabalho().
Agora com o Simao conectado a UTFPR,
por isso consegue fazer aquela colaboração
no âmbito da função OndeTrabalho() que eu já expliquei.
Novamente,
esse momento aqui é muito importante.
Aqui sumiu o código Executar() aqui, tá.
O código aqui da chamada de Executar(),
mas tudo bem, de qualquer forma, eu queria destacar é esse...
esse código que está ali destacado.
Aqui, eu faço então,
aqui eu crio a relação lá na construtora do Simao para com a UTFPR.
Muito bem, pessoal, vocês podem
revisar com calma esses slides, revisar o discurso,
me contatar
através dos meios disponibilizados pra gente tirar alguma eventual dúvida, tá.
Esse... essa aula é muito importante
pra começar a se simpatizar com os conceitos de agregação
e os conceitos de associação,
os quais a gente vai aprofundar
nas exposições subsequentes.
Para tal, eu rogo que
vocês façam esses exercícios.
Criar... exercício três, aí, de associação.
Criar dois objetos de Universidade
associando um para Einstein e outro para Newton.
Então, o Simão ali, ó.
O Simao já tem uma relação com a Universidade UTFPR,
mas o Einstein e o Newton estão sem Universidade.
Ter que dá um jeito de resolver isso.
Einstein trabalhou em Princeton e o Newton trabalhou em Cambridge.
É esse o universo desse exercício.
Aqui tem outro exercício, um pouco mais audaz.
Criar uma classe Departamento que permita agregar
um objeto de Departamento, portanto, na classe Universidade.
Se o a classe Principal,
eu tenho objetos como Simao e UTFPR,
agora eu quero que, por exemplo, o objeto UTFPR
possa ter um Departamento dentro de si.
Ainda, a classe Pessoa deve possuir uma referência
ao departamento que trabalha, ou seja,
ela deve possuir uma associação
ela, a classe Pessoa, vai possuir uma associação
com a classe Departamento, permitindo a cada objeto
em instância de classe Pessoa
tenha a referência de um objeto Departamento.
Dito de outra forma, eu quero que
as pessoas, cada pessoa, sei lá, o Simao, além de conhecer
UTFPR, também conheça o Departamento.
Isso que são os exercícios, tá, eu gostaria que vocês trabalhassem, tentassem fazer
em antes de olhar as soluções que vão ser apresentadas nos próximos grupos de slides.
Pessoal,
me estendi um pouco, mas é natural, porque tinha um conteúdo
importante a ser trabalhado e ser bem fixado
aí no tocante a esses slides apresentados.
Obrigado pela atenção,
nos vemos numa próxima exposição.
Tchau, tchau.