Ir ao conteúdo
  • Cadastre-se

C++ Referenciar Atributo de uma Classe Dentro de Outra


Ir à solução Resolvido por Flávio Pedroza,

Posts recomendados

Estou construindo um sistema de petshop (com interface gráfica usando QT Creator para C++), onde existe uma classe Cliente e uma classe Animal (que possui outras 4 classes herdeiras [Gato, Cachorro, Ave, Tartaruga]), ao fazer o cadastro na petshop a classe cliente faz referencia à Animal. 

 

Meu problema não é com a interface gráfica (AINDA), porém...

 

..quando instancio o objeto cliente1 e bicho3 na main da seguinte forma, tenho problemas em acessar o metodo "getPelagem()" que pertence a classe Gato :

 

    Gato *bicho3 = new Gato("preto", true, "plutinho", 'M', 0, 0.5);
    Cliente *cliente1 = new Cliente(bicho3, "Pascoal", 25, "064.845.741-32", "R. Onofre Pereira");

    cout << cliente1->getNome() << endl;
    cout << cliente1->getPet()->getNome() << endl;

	cout << cliente1->getPet()->getPelagem() << endl; //recebo um erro de compilação

 

Gostaria de saber, de que maneira eu poderia resolver esse problema, sem ter que alterar a maneira como minhas classes estão definidas ?!

 

As classes estão definidas da seguinte forma:

 

animal.h

#ifndef ANIMAL_H
#define ANIMAL_H

#include <QMainWindow>
#include <string>

using namespace std;

QT_BEGIN_NAMESPACE
namespace Ui { class Animal; }
QT_END_NAMESPACE


class Animal : public QMainWindow{
    Q_OBJECT
private:
    Ui::Animal *ui;

protected:
    string nome;
    char sexo; // M|F
    int idade;
    float peso;
public:
    Animal(QWidget *parent = nullptr);
    Animal(string nome, char sexo, int idade, float peso);
    string getNome();
    ~Animal();
};

class Cachorro : public Animal{
private:
    string raca;
    string pelagem;
    bool adestrado;
    bool castrado;
public:
    Cachorro(string raca, string pelagem, bool adestrado, bool castrado, string nome, char sexo, int idade, float peso);
    string getRaca();
};

class Gato : public Animal{
private:
    string pelagem;
    bool castrado;
public:
    Gato(string pelo, bool castrado, string nome, char sexo, int idade, float peso);
    string getPelagem();
};

class Ave : public Animal{
private:
    bool dieta;
    bool gaiola;
    string penugem;
    string especie;
    float invergadura;
public:
    Ave(bool dieta, bool gaiola, string penugem, string especie, float invergadura, string nome, char sexo, int idade, float peso);
    bool isDieta();
    string getEspecie();
};

class Tartaruga : public Animal{
private:
    bool dieta;
    string tipoDeAmbiente;
    float tamanhoDaCarapaca;
public:
    Tartaruga(bool dieta, string tipoDeAmbiente, float tamanhoDaCarapaca, string nome, char sexo, int idade, float peso);
    bool isDieta();
    string getTipoDeAmbiente();
    float getTamanhoDaCarapaca();
};


#endif // ANIMAL_H

 

cliente.h

#ifndef CLIENTE_H
#define CLIENTE_H

#include "animal.h"

class Cliente{
private:
    Animal *pet;
    string nome;
    int idade;
    string cpf;
    string endereco;
public:
    Cliente(Animal *pet, string nome, int idade, string cpf, string endereco);
    string getNome();
    Animal *getPet();
};

#endif // CLIENTE_H

 

animal.cpp

#include "animal.h"
#include "./ui_animal.h"

using namespace std;

Animal::Animal(string nome, char sexo, int idade, float peso){
    this->nome = nome;
    this->sexo = sexo;
    this->idade = idade;
    this->peso = peso;
}

string Animal::getNome(){
    return this->nome;
}

Cachorro::Cachorro(string raca, string pelagem, bool adestrado, bool castrado, string nome, char sexo, int idade, float peso):Animal(nome, idade, sexo, peso){
    this->raca = raca;
    this->pelagem = pelagem;
    this->adestrado = adestrado;
    this->castrado = castrado;
}

string Cachorro::getRaca(){
    return this->raca;
}

Gato::Gato(string pelagem, bool castrado, string nome, char sexo, int idade, float peso):Animal(nome, idade, sexo, peso){
    this->pelagem = pelagem;
    this->castrado = castrado;
}

string Gato::getPelagem(){
    return this->pelagem;
}

Ave::Ave(bool dieta, bool gaiola, string penugem, string especie, float invergadura, string nome, char sexo, int idade, float peso):Animal(nome, sexo, idade, peso){
    this->dieta = dieta;
    this->gaiola = gaiola;
    this->penugem = penugem;
    this->especie = especie;
    this->invergadura = invergadura;
}

bool Ave::isDieta(){
    return this->dieta;
}
string Ave::getEspecie(){
    return this->especie;
}

Tartaruga::Tartaruga(bool dieta, string tipoDeAmbiente, float tamanhoDaCarapaca, string nome, char sexo, int idade, float peso) : Animal(nome, sexo, idade, peso){
    this->dieta = dieta;
    this->tipoDeAmbiente = tipoDeAmbiente;
    this->tamanhoDaCarapaca = tamanhoDaCarapaca;
}

bool Tartaruga::isDieta(){
    return this->dieta;
}

string Tartaruga::getTipoDeAmbiente(){
    return tipoDeAmbiente;
}

float Tartaruga::getTamanhoDaCarapaca(){
    return this->tamanhoDaCarapaca;
}

/**************************************************/
Animal::Animal(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::Animal)
{
    ui->setupUi(this);
}

Animal::~Animal()
{
    delete ui;
}

 

cliente.cpp

#include "cliente.h"


Cliente::Cliente(Animal *pet, string nome, int idade, string cpf, string endereco){
    this->pet = pet;
    this->nome = nome;
    this->idade = idade;
    this->cpf = cpf;
    this->endereco = endereco;
}

string Cliente::getNome(){
    return this->nome;
}

Animal* Cliente::getPet(){
  return this->pet;
}

 

main.cpp

#include <iostream>
#include "animal.h"
#include "cliente.h"
#include <QApplication>



int main(int argc, char *argv[]){
/******************************************/
    QApplication a(argc, argv);
    Animal w;
    w.show();
/*****************************************/

        Gato *bicho3 = new Gato("preto", true, "plutinho", 'M', 0, 0.5);
        cout << bicho3->getNome() << endl;
        cout << bicho3->getPelagem() << endl << endl;


    Cliente *cliente1 = new Cliente(bicho3, "Pascoal", 25, "064.845.741-32", "R. Onofre Pereira");
    cout << cliente1->getNome() << endl;
    cout << cliente1->getPet()->getNome() << endl;

    cout << cliente1->getPet()->getPelagem() << endl;  //main.cpp:43:33: error: no member named 'getPelagem' in 'Animal'





    return a.exec();
}

 

Link para o comentário
Compartilhar em outros sites

45 minutos atrás, Flávio Pedroza disse:

cout << dynamic_cast<Gato *>(cliente1->getPet())->getPelagem() << endl;

Para aprender mais sobre:

http://www.cplusplus.com/doc/oldtutorial/typecasting/

 

 

Muito grato, estou seguindo com a leitura, começarei a trabalhar com polimorfismo em C++ e acredito que sua dica vai me ajudar muito !!!

Link para o comentário
Compartilhar em outros sites

4 horas atrás, Gabriel Barbosa Brandao disse:

Gostaria de saber, de que maneira eu poderia resolver esse problema, sem ter que alterar a maneira como minhas classes estão definidas ?!

 

Esse é um problema, porque eu começaria por aí.

 

  • Não entendi porque derivou Animal de QMainWindow. Isso só vai te dar problemas. Porque precisa misturar classes relacionadas ao modelo com classes relacionadas à interface?
  • Talvez seja mais seguro deixar a classe base Animal como abstrata. Não sei se faz sentido criar os pets em lugares distintos, uma parte em Gato() e outra em Animal() por exemplo. E porque alguém iria declarar um Animal afinal? 
  • Cliente deveria ter um vetor de ponteiros para Animal, ou algum outro container, já que é provável que um cliente tenha mais de um pet...
  • Uma função virtual tipo QualBicho() podia retornar uma string com o tipo de animal. Seria bem útil e não precisaria se basear em herança para preparar simples mensagens por exemplo
  • Não há nada nos registros dos pets que indique o dono. Estranho isso. E nenhum tipo de id para poder conviver com todos os Toy, Rex e Lily do cadastro.

 

 

class Animal : public QMainWindow{ Q_OBJECT

Link para o comentário
Compartilhar em outros sites

@arfneto

  • class Animal : public QMainWindow{ Q_OBJECT 

    foi criada pelo próprio framework na vdd a classe JanelaPrincipal é que herdará de QMainWindow, como eu estava começando a trabalhar eu criei a classe animal ali mesmo para fazer alguns testes.

  • No caso do petshop eles não irão fazer alguns trabalhos como tosa, ou hotelaria com outro tipo de animal que não seja os 4 herdeiros declarados (gato, cachorro, ave, tartaruga) porém eles ainda podem medicar ou dar banho nesses bichinhos, e pra isso só interessante o nome a idade, o sexo e o peso deles.

  • Bem lembrado, vou pensar em uma maneira bacana de implementar isso. Obrigado pela dica!!

  • Meu objeto animal precisa retornar cada atributo de cada diferente animal cadastrado a menos que seja um animal de uma família diferente das que o petshop trabalha comumente.

  • Cada cliente se cadastrará com seus dados e os dados de seu pet, que são armazenados dentro do objeto Cliente, estou no processo de implementação da classe Serviços() que será responsável por armazenar essas entidades em um banco de dados usando MySQL, nessa classe pretendo fazer os devidos registros e alterações nos atributos das classes se preciso.

 

Estou na etapa inicial do processo de desenvolvimento, estou experimentando um pouco do framework ao mesmo tempo que aprimorando os conceitos de POO com C++, algumas coisas ainda estão precárias devido a isso.

 

Obrigado pela atenção e sugestões !!

 

Link para o comentário
Compartilhar em outros sites

8 horas atrás, Gabriel Barbosa Brandao disse:

oi criada pelo próprio framework na vdd a classe JanelaPrincipal é que herdará de QMainWindow, como eu estava começando a trabalhar eu criei a classe animal ali mesmo para fazer alguns testes

 

Tire isso de lá. Animal nada tem a ver com o Qt. é so apagar a derivação.

8 horas atrás, Gabriel Barbosa Brandao disse:

No caso do petshop eles não irão fazer alguns trabalhos como tosa, ou hotelaria com outro tipo de animal que não seja os 4 herdeiros declarados (gato, cachorro, ave, tartaruga) porém eles ainda podem medicar ou dar banho nesses bichinhos, e pra isso só interessante o nome a idade, o sexo e o peso deles

 

Apenas crie uma classe OutroPet por exemplo e invalide o construtor de Animal 

 

8 horas atrás, Gabriel Barbosa Brandao disse:

Meu objeto animal precisa retornar cada atributo de cada diferente animal cadastrado a menos que seja um animal de uma família diferente das que o petshop trabalha comumente

 

Por isso usou Animal como base class. Essa é a finalidade de herança: especialização. Entendeu o que falei sobre ter também um método virtual retornando o tipo de Pet?
 

8 horas atrás, Gabriel Barbosa Brandao disse:

Cada cliente se cadastrará com seus dados e os dados de seu pet, que são armazenados dentro do objeto Cliente, estou no processo de implementação da classe Serviços() que será responsável por armazenar essas entidades em um banco de dados usando MySQL, nessa classe pretendo fazer os devidos registros e alterações nos atributos das classes se preciso

 

Pois é: e as classes nesse caso virão do banco de dados e você não tem a relação entre pet e cliente na classe Animal

Acrescente também um campo numérico, como os clássicos id ou nsu para facilitar a referência e as pesquisas...

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!