como fazer este codigo funcionar realmente?[RESOLVIDO]

1. como fazer este codigo funcionar realmente?[RESOLVIDO]

Jean César
dark777

(usa Slackware)

Enviado em 19/12/2016 - 00:05h

#include <cstdlib>
#include <iostream>

class Mamifero
{
public:
Mamifero(){}
~Mamifero(){}

virtual void somMamifero() const
{
std::cout<<"\n\tSom de mamifero.\n";
}

virtual void menu() const
{
Mamifero* mamPtr;
int op;
while(op != 5)
{
std::cout<<"\n\t(1) Boi"
<<"\n\t(2) Gato"
<<"\n\t(3) Porco"
<<"\n\t(4) Cachorro"
<<"\n\t(5) Sair"
<<"\n\tDigite: ";
std::cin>>op;
switch(op)
{
case 1:{
mamPtr = new Mamifero();
mamPtr->somMamifero();
break;
}
case 2:{
mamPtr = new Mamifero();
mamPtr->somMamifero();
break;
}
case 3:{
mamPtr = new Mamifero();
mamPtr->somMamifero();
break;
}
case 4:{
mamPtr = new Mamifero();
mamPtr->somMamifero();
break;
}
case 5:{
std::cout<<"\n\tGood Bye\n\n";
exit(0);
break;
}
default:
std::cout<<"\n\tOpção Inválida ..!!!\n";
}
}
}

};

class Boi: public Mamifero
{
public:
void somMamifero() const
{
std::cout<<"\n\tMuu ..! Muu..!!\n";
}

void menu() const
{
Mamifero* mamPtr;
mamPtr = new Boi();
mamPtr->somMamifero();
}
};

class Gato: public Mamifero
{
public:
void somMamifero() const
{
std::cout<<"\n\tMiAu ..! MiAu..!!\n";
}

void menu() const
{
Mamifero* mamPtr;
mamPtr = new Gato();
mamPtr->somMamifero();
}
};

class Porco: public Mamifero
{
public:
void somMamifero() const
{
std::cout<<"\n\tOinc ..! Oinc..!!\n";
}

void menu() const
{
Mamifero* mamPtr;
mamPtr = new Porco();
mamPtr->somMamifero();
}
};

class Cachorro: public Mamifero
{
public:
void somMamifero() const
{
std::cout<<"\n\tAu ..! Au..!!\n";
}

void menu() const
{
Mamifero* mamPtr;
mamPtr = new Cachorro();
mamPtr->somMamifero();
}
};

int main()
{
Mamifero *m = new Mamifero();;
m->menu();
}


  


2. Re: como fazer este codigo funcionar realmente?[RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 19/12/2016 - 01:37h

Não se usa chaves { e } para blocos case em switch.

switch (...) {

case ... :

comando1;
comando2;
comando3;
break;

case ... :

comando1;
comando2;
comando3;
break;

...

default:

comando1;
comando2;
comando3;
break;

}


----------------------------------------------------------------------------------------------------------------
Nem direita, nem esquerda. Quando se trata de corrupção o Brasil é ambidestro.
(anônimo)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden



3. Re: como fazer este codigo funcionar realmente?[RESOLVIDO]

Jean César
dark777

(usa Slackware)

Enviado em 19/12/2016 - 03:19h

listeiro_037 escreveu:

Não se usa chaves { e } para blocos case em switch.

switch (...) {

case ... :

comando1;
comando2;
comando3;
break;

case ... :

comando1;
comando2;
comando3;
break;

...

default:

comando1;
comando2;
comando3;
break;

}


----------------------------------------------------------------------------------------------------------------
Nem direita, nem esquerda. Quando se trata de corrupção o Brasil é ambidestro.
(anônimo)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden


Hã? nao se usa chave? a ta OK ... o codigo esta rodando eu quero que o mesmo execute cada um sua função e som....




4. Re: como fazer este codigo funcionar realmente?[AJUDA]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 19/12/2016 - 07:54h

Sua função menu() não deve ser um membro da classe base. Caso contrário, ficará difícil para você estendê-la com novos mamíferos, pois teria de criar na classe base dependências de cada nova classe filha.

Sugiro que a função-membro somMamifero() seja renomeada apenas para som(), já que será virtual e redefinida em cada classe derivada.

Além disso, este poderia ser um caso de uso do que se chama de “construtor virtual”, que é a situação em que um objeto pré-existente, num ponto qualquer da hierarquia de classes, a partir de um ponteiro para a classe base, é usado para construir outro objeto de mesmo tipo.

class mamifero {
public:
mamifero(){}

virtual mamifero *reproduz() = 0; // Construtor virtual (e abstrato, para obrigar reimplementação em cada classe derivada).
virtual std::string nome() = 0;
virtual std::string som() = 0;
};

class cachorro: public mamifero {
public:
cachorro *reproduz(){ return new cachorro; }
std::string nome(){ return "cachorro"; }
std::string som() { return "latido"; }
};

class gato: public mamifero {
public:
gato *reproduz() { return new gato; }
std::string nome(){ return "gato"; }
std::string som() { return "miado"; }
};

class homem: public mamifero {
public:
homem *reproduz() { return new homem; }
std::string nome(){ return "homem"; }
std::string som() { return "música"; }
};

std::vector<mamifero *> opcoes{new homem, new cachorro, new gato};
std::vector<mamifero *> ecossistema;

mamifero *menu(){
int n=0;
std::cout << "Diga qual animal vai se reproduzir:\n";
for(const auto &animal: opcoes)
std::cout << '\t' << n++ << ": " << animal->nome() << '\n';
std::cout << "--> ";
std::cin >> n;
return opcoes[n]->reproduz();
}



5. Re: como fazer este codigo funcionar realmente?[RESOLVIDO]

Jean César
dark777

(usa Slackware)

Enviado em 19/12/2016 - 16:02h

nao entendi bem essas linhas abaixo:
executei o codigo e deu erros aqui pois no lugar de; const auto &animal nao seria ecosistema?

std::vector<mamifero *> opcoes{new homem, new cachorro, new gato};
std::vector<mamifero *> ecossistema;

mamifero *menu(){
int n=0;
std::cout << "Diga qual animal vai se reproduzir:\n";
for(const auto &animal: opcoes)
std::cout << '\t' << n++ << ": " << animal->nome() << '\n';
std::cout << "--> ";
std::cin >> n;
return opcoes[n]->reproduz();
}


6. Re: como fazer este codigo funcionar realmente?[AJUDA]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 19/12/2016 - 18:45h

Eu escrevi diretamente no fórum, mais com intuito de ser ilustrativo do que ser rigorosamente correto na sintaxe (apesar de que eu tentei não cometer nenhum erro).

Vou testar melhor quando chegar a casa.


7. Re: como fazer este codigo funcionar realmente?[RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 19/12/2016 - 20:18h

Como eu queria, o programa que eu mostrei não tem nenhum erro.

Qual compilador você está usando, e com que opções de compilação.

Note que eu estou usando C++11. Se você ainda estiver com o obsoleto C++98, o código realmente não vai compilar.


8. Re: como fazer este codigo funcionar realmente?[RESOLVIDO]

Jean César
dark777

(usa Slackware)

Enviado em 19/12/2016 - 20:31h

paulo1205 escreveu:

Como eu queria, o programa que eu mostrei não tem nenhum erro.

Qual compilador você está usando, e com que opções de compilação.

Note que eu estou usando C++11. Se você ainda estiver com o obsoleto C++98, o código realmente não vai compilar.



normal a versao do meu compilador é:

bash-4.3$ g++ --version
g++ (GCC) 5.4.0
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

a minha linha de comando para compilação é:

g++ -o teste teste.cpp


9. Re: como fazer este codigo funcionar realmente?[RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 19/12/2016 - 20:39h

Talvez um código mais completo, incluindo uma função main() que faz uso das coisas mostradas, ajude você a entender o que eu propus. Só não sei se é uma solução que lhe atenda.

#include <iostream>
#include <vector>
#include <string>
#include <cctype>

class mamifero {
public:
mamifero(){}
virtual mamifero *reproduz() = 0; // Construtor virtual (e abstrato, para obrigar reimplementação em cada classe derivada).
virtual std::string nome() = 0;
virtual std::string som() = 0;
};

class cachorro: public mamifero {
public:
cachorro *reproduz(){ return new cachorro; }
std::string nome(){ return "cachorro"; }
std::string som() { return "latido"; }
};

class gato: public mamifero {
public:
gato *reproduz() { return new gato; }
std::string nome(){ return "gato"; }
std::string som() { return "miado"; }
};

class homem: public mamifero {
public:
homem *reproduz() { return new homem; }
std::string nome(){ return "homem"; }
std::string som() { return "música"; }
};

std::vector<mamifero *> opcoes{new homem, new cachorro, new gato};
std::vector<mamifero *> ecossistema;

mamifero *menu(){
int n=0;
std::cout << "Diga qual animal vai se reproduzir:\n";
for(const auto &animal: opcoes)
std::cout << '\t' << n++ << ": " << animal->nome() << '\n';
std::cout << "--> ";
std::cin >> n;
std::cin.ignore(1, '\n');
return opcoes[n]->reproduz();
}


int main(){
std::string resposta;
while(true){
std::cout << "O ecossistema tem " << ecossistema.size() << " mamífero(s).\n";
if(ecossistema.size()>0)
for(const auto &animal: ecossistema)
std::cout << "\t- um " << animal->nome() << ", que emite " << animal->som() << ".\n";
std::cout << "\nQuer inserir um novo mamífero no ecossistema? ";
getline(std::cin, resposta);
std::cout << '\n';
if(tolower(resposta[0])!='s')
break;
ecossistema.push_back(menu());
std::cout << '\n';
}
std::cout << "Ao final, o ecossistema tinha " << ecossistema.size() << " mamíferos.\n";
if(ecossistema.size()>0)
for(const auto &animal: ecossistema)
std::cout << "\t- um " << animal->nome() << ", que emite " << animal->som() << ".\n";
}



10. Re: como fazer este codigo funcionar realmente?[RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 20/12/2016 - 09:56h

dark777 escreveu:

paulo1205 escreveu:

Note que eu estou usando C++11. Se você ainda estiver com o obsoleto C++98, o código realmente não vai compilar.


normal a versao do meu compilador é:

bash-4.3$ g++ --version
g++ (GCC) 5.4.0
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

a minha linha de comando para compilação é:

g++ -o teste teste.cpp


O default do GCC 5.x ainda é usar C++98. Selecione C++11 ou C++14, através da opções -std=c++11 ou -std=c++14 (ou, se você quiser habilitar as extensões GNU, -std=gnu++11 ou -std=gnu++14).