Ir para conteúdo
Fórum Script Brasil
  • 0

Classe de composição/agregação


xtremekaffeine

Pergunta

Update do link com o projeto e da aula pelo YouTube

O problema é o seguinte:

A minha classe de composição "Visualizacao", é composta por duas outras classes "Video" e "Gafanhoto", após passar alguns dados eu notei que essas informações ficam apenas na classe Visualizacao e não gravam nas classes Video e Gafanhoto, também notei que as contagens de "totAssistidoCont()" e "viewCont()" não aparecem corretamente quando chamo as informações da classe Visualizacao. A propósito eu usei os exemplos de java do curso em vídeo para tentar fazer o mesmo em c++, vou deixar o link para o caso de alguém querer conferir: 

Eu usei o CodeBlocks com TDM-GCC-5.1.0-3

Link do arquivo: https://www.dropbox.com/s/121vwnf6mmlfcju/ProjetoYouTube.zip?dl=0

Se alguém puder testar e me ajudar eu agradeço muito.

Aí estão as imagens com os códigos

pessoa.h.png

pessoa.cpp.png

gafanhoto.h.png

gafanhoto.cpp.png

video.h.png

video.cpp.png

acoesvideo.h.png

visualizacao.h.png

visualizacao.cpp.png

main.cpp.png

Editado por xtremekaffeine
Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0
18 horas atrás, xtremekaffeine disse:

também notei que as contagens de "totAssistidoCont()" e "viewCont()" não aparecem corretamente quando chamo as informações da classe Visualizacao.

Vamos começar pelo mais fácil, variáveis membro estáticas. Acho que seu problema é que você não entendeu o uso que tem as variáveis estáticas. Vamos imaginar que você tem um video-club de aluguel de filmes. Vamos imaginar que lá tem vários filmes, mas para nosso exemplo vamos ter somente 2 filmes, Matrix e Star Wars, porem serve para quantos filmes você quiser. Vamos imaginar que por alguma estranha razão o usuário quer saber quantas vezes se alugaram cada um dos filmes.

Vou deixar de lado tantas funções dentro das classes que lhe vou passar a continuação como exemplo, vou apenas me centrar em variáveis estáticas de forma que não vou ficar desenvolvendo métodos geters e seters que seria o correto para um exemplo funcional, declararei como publicas as variáveis estáticas com o simples motivo de facilitar a compreensão do problema.

Bom... como falei imaginemos que queremos saber quantas vezes se alugou cada filme, uma forma simples poderia ser:

#include <iostream>
using namespace std;

class Filme {
    public:
    int contador;
    Filme(){this->contador = 0;}
};

int main (){
    
    Filme matrix;       //Criamos o filme Matrix
    matrix.contador++;  //E alugamos o filme
    
    cout << "Matrix: " << matrix.contador << endl; //vamos comprovar quantas vezes o filme foi alugado
    
    matrix.contador++;  //Alugamos o filme novamente
    
    cout << "Matrix: " << matrix.contador << endl; //E voltamos a comprovar
    
    //Agora vamos criar o filme Star Wars
    Filme starWars;
    starWars.contador++;  //E alugamos a fita >_<
    
    //vamos ver quantas vezes se alugou cada uma das fitas individualmente
    cout << endl;
    cout << "Matrix: " << matrix.contador << endl; 
    cout << "Star Wars: " << starWars.contador <<endl;
    
    cin.ignore();
    return 0;
}

Como podemos ver nesse exemplo em cada filme queríamos ver quantas vezes foi alugado individualmente, mas e se por outra razão eu quero saber o numero de alugueis geral, é dizer...
Como eu faria para saber quantas vezes foram alugados ambos filmes juntos? Se eu aluguei Matrix 2 vezes e Satr wars 1 esse valor seria 3 correto? Vamos ver o exemplo:

#include <iostream>
using namespace std;

class Filme {
    public:
    static int contador;
};

int Filme::contador = 0; //Variaveis estáticas devem ser inicializadas

int main (){
    
    Filme matrix;       //Criamos o filme Matrix
    matrix.contador++;  //E alugamos o filme
    
    cout << "Matrix: " << matrix.contador << endl; //vamos comprovar quantas vezes o filme foi alugado
    
    matrix.contador++;  //Alugamos o filme novamente
    
    cout << "Matrix: " << matrix.contador << endl; //E voltamos a comprovar
    
    //Agora vamos criar o filme Star Wars
    Filme starWars;
    starWars.contador++;  //E alugamos a fita >_<
    
    //vamos ver quantas vezes se alugaram as fitas
    cout << endl;
    cout << "Matrix: " << matrix.contador << endl; 
    cout << "Star Wars: " << starWars.contador <<endl;
    
    cin.ignore();
    return 0;
}

Como podemos ver o contador de matrix e starWars é o mesmo literalmente. Mesmo que você incremente matrix, starWars vai ter o mesmo valor e vice-versa. Variáveis estáticas membro é um tipo de variável compartilhada entre todos os objetos, literalmente é uma só variável porem que ambos objetos tem acesso. Se eu quero contar cada objeto de forma individual eu uso int porque internamente cada objeto tem sua variável contador, se eu incrementar o contador do obeto A o contador do objeto B não se verá afetado, porem com estáticas se eu aumentar o contador do objeto A o contador do objeto B também se verá afetado, porque se trata da mesma variável compartilhada entre A e B, internamente só existe um contadar quando é estático, isso serve para quando necessitamos por exemplo saber quantas vezes todos objetos foram alugado no total e n4ao individualmente por exemplo.

Outros exemplos poderiam ser uma garagem, imagine que tenho carro A e carro B, dai quero saber se uma garagem está ocupada, por um dos carros, era só ter uma variável tal que static boll ocupado;, se um dos carros está na vaga, ocupado = true;, o outro carro deverá buscar outra vaga.

São muitos os usos que podem ser dados a variáveis estáticas porem lembre disso... variáveis estáticas é um tipo de variável compartilhada entre todos os objetos se eu modificala no objeto A essa será tambem modificada nos objetos B, C, D, etc, porque ela é a mesma variável para todos os objetos(compartilhada).



 

Link para o comentário
Compartilhar em outros sites

  • 0
19 horas atrás, xtremekaffeine disse:

após passar alguns dados eu notei que essas informações ficam apenas na classe Visualizacao e não gravam nas classes Video e Gafanhoto

Claro que não. Vamos a ver... acho que você está mal interpretando a programação orientada a objetos. Uma coisa é um barco e outra coisa é a ideia do que seria um barco, ou os planos para construir um barco.

Quando eu estou definindo uma classe eu estou definindo a ideia de como será o barco, realmente eu não estou criando o barco, se não os planos de como seria um barco. O barco eu crio quando declarar a variável do tipo barco que é o objeto criado a partir da classe barco. Modificar um barco não tem porque modificar os planos de um barco.

Vamos imaginar que Ferrari criou um projeto de um carro muito exclusivo, somente sairão 2 unidades. Imagine que você comprou um desses modelos(rapaz de sorte >_<), o outro modelo comprou seu vizinho XD. Dai imagine que seu vizinho quer fazer tunning de sua ferrari(Seria um louco). você acha que se o vizinho modificar seu carro todos serão modificados? Ou ainda pior... se ele por umas rodas de bmv(Brazilia meio velha) na Ferrari dele o projeto da fábrica deveria ser modificado? Não né! Ele pode fazer as baianadas  que ele quiser com o carro dele, nem o projeto nem seu carro se verá afetados, ele está modificando um objeto, os outros continuam intactos, e a Ferrari continuará pondo rodas super esportivas.

Deu para entender? Se quiser modificar um objeto e quiser que todos sejam iguais use estáticas que são compartilhadas caso contrario cada classe terá seu quite de variáveis independentes.

Sobre a direção dos vídeos pensei que você iria me passar sobre o vídeo de composição, não o curso completo heheh.

Se continuar com duvidas entre no discord; https://discord.gg/CtfUywV

Link para o comentário
Compartilhar em outros sites

  • 0

Muito obrigado pela ajuda, ainda sou iniciante em programação e tem muita coisa que preciso entender, eu criei o código com base nas vídeo-aulas de java, e percebo agora que para fazer a mesma coisa funcionar corretamente em c++ preciso seguir um caminho um pouco diferente do que faria em java. Se você der uma olhada no vídeo 15b do link que mandei perceberá que todos esses dados ficam gravados nas demais classes, inclusive as contagens para cada filme a partir do momento da instancia do objeto da classe Visualizacao, pensei que em c++ aconteceria da mesma forma. Sou muito grato pela sua contribuição e agora que você me deu uma "luz" vou modificar algumas coisas no código para entender melhor aonde errei. Muito obrigado.

Link para o comentário
Compartilhar em outros sites

  • 0

Não se esquente. Talvez eu não tenha entendido muito sua consulta devido ao meu desconhecimento sobre java, meu contato com java se resume a algumas semanas de prova, o suficiente para saber que java é bastante mais limitado ao que se refere a poo que c++.

A ver se chegamos a entender onde falha o que comentas.
 

Em 30/1/2017 at 14:58, xtremekaffeine disse:

A minha classe de composição "Visualizacao", é composta por duas outras classes "Video" e "Gafanhoto", após passar alguns dados eu notei que essas informações ficam apenas na classe Visualizacao e não gravam nas classes Video e Gafanhoto

Se com "é composta" vc se refere que dentro de visualização vc tem 2 objetos dos tipos vídeo e gafanhoto sim, correto. Dai quando vc instância um objeto da classe Visualizacao vc recebe 2 parametros, o gafanhoto e o vídeo que deveria assistir o gafanhoto. Certo? Então no seu construtor vc está copiando o gafanhoto e o video para o gafanhoto e para o video que estão dentro de visualização. Talvez o que vc não entenda é que vc tem 2 gafanhotos, o que vc passa para visualização e o que esta dentro de visualização. Dai certamente vem sua confusão, ou ao menos isso é o que eu to achando que é. Porque acho que vc queria que os dados se gravaram no gafanhoto que vc passa como dados também ou sei lá, mas isso não é o que acontece. O gafanhoto modificado é o que esta dentro de visualização.

prove usar os geters de visualização para comprovar os dados, tipo cout << vis[0].espectador.getTotAssistido();. Isso vai imprimir o gafanhoto que ta dentro de visualização.

Se quiser analisar melhor o código entre aqui no discord:https://discord.gg/CtfUywV

Podemos discutir melhor e/ou talvez fazer uma tela compartilhada para solucionar esse problema e aplicar alguma solução.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...