Ir ao conteúdo
  • Cadastre-se
Rafael Filho Macedo

C++ Problema com Cass Abstrata

Recommended Posts

Olá, então, criei uma Cass e tenho que cria uma aplicação que demonstre o funcionamento desta Class. Creio eu que a Class esta correta. No programa principal eu iniciei os valores para cada objeto dentro da minha Class, mas quando eu quero usar esse valores aparece o valor alterado apenas no primeiro objeto, nos demais objetos o valor não muda.

 

Pra resumir, só aparece a area e perimetro do quadrado, o restante fica tudo 0.

 

#include <iostream>
#include <string.h>
#include <math.h>
#include "Class.h"
#include <locale.h>
using namespace std;


int main()
{
setlocale(LC_ALL,"");
 
Shape *S4[4];
S4[0] = new Square(10);
S4[1]= new Rectangle(4,6);
S4[2] = new Triangle(2,3);
S4[3] = new Circle(4);




cout << "=========================== DADOS QUADRADO ==================================" << endl;
cout << endl;
cout << "Area do Quadrado = " << S4[0]->Area() << " metros quadrados!" << endl;
cout << "Perimetro do Quadrado = " << S4[0]->Perimetro() << " metros!" << endl;
cout << endl;
cout << "=========================== DADOS RETANGULO =================================" << endl;
cout << endl;
cout << "Area do Retangulo = " << S4[1]->Area() << " metros quadrados!" << endl;
cout << "Perimetro do Retangulo = " << S4[1]->Perimetro() << " metros!" << endl;
cout << endl;
cout << "=========================== DADOS TRIANGULO =================================" << endl;
cout << endl;
cout << "Area do Triangulo = " << S4[2]->Area() << " metros quadrados!" << endl;
cout << "Perimetro do Triangulo = " << S4[2]->Perimetro() << " metros!" << endl;
cout << endl;
cout << "=========================== DADOS CIRCULO ===================================" << endl;
cout << endl;
cout << "Area do Circulo = " << S4[3]->Area() << " metros quadrados!" << endl;
cout << "Perimetro do Circulo = " << S4[3]->Perimetro() << " metros!" << endl;
cout << endl;
cout << "=============================    FIM   ======================================" << endl;
 system("pause >> null ");
 return 0;   
}

 

 

Aqui abaixo deixei a class pra quem quiser ver se tem algo errado:

 

#include <iostream>
#include <string.h>
#include <math.h>

using namespace std;


class Shape
{
      public:
             virtual float Area() = 0;
             virtual float Perimetro() = 0;
};

/////// Classe Quadrado

class Square:public Shape
{
      
      private:
              float Lado;
      public:
      
      	/////construtor padrão
      		Square (float x)
          {
             Lado = x;
          }  
      	///////////////////////
      	
      		 void set_Lado(float x)
             {
                  Lado = x;
             }
             
             float get_Lado()
             {
                  return Lado;
             }
             
             virtual float Area()
             {
                 return Lado*Lado; 
             }
             
             virtual float Perimetro()
             {
                return Lado *4;
             }  
};

/////// Classe Retangulo

class Rectangle:public Shape
{
      
       private:
        float b;
        float h;
      
      
       public:
          
          /////construtor padrão
      		Rectangle (float _b, float _h)
          {
             float b = _b;
       		 float h = _h;
          }  
      	///////////////////////
          
          
        float get_b()
        	{
        		return b;
        	} 
        
        void set_b(float _b)
        {
        	b=_b;
        } 
        
        float get_h()
        	{
        		return h;
        	}
        
        void set_h(float _h)
        	{
        		h=_h;
        	} 
        
        virtual float Area()
        	{	
       			return b*h;     
        	}   
        
        virtual float Perimetro()
        	{
				return (2*h) + (2*b);
			}
};

/////// Classe Circulo

class Circle:public Shape
{
      
      private:
        float r;
            
      public:
         
          /////construtor padrão
      	Circle (float x)
          {
             float r = x;
          }  
      	///////////////////////
         
        float get_r()
          {
        return r;
          } 
        
        void set_r(float _r)
        	{
        		r=_r;
       		 } 
         
        virtual float Area()
        	{
				return 3.14*r*r;     
        	}
		
		virtual float Perimetro()  
			{
				return 2*3.14*r;     
        	} 
};	

////////Classe Trangulo
class Triangle:public Shape
{

      private:
        float b;
        float h;
        
        
      public:
             
             /////construtor padrão
      	Triangle (float _b, float _h)
          {
             float b = _b;
        	 float h = _h;
          }  
      	///////////////////////
             
        float get_b()
        	{
        		return b;
        	} 
        
        void set_b(float _b)
        	{
        		b=_b;
        	} 
        
        float get_h()
        	{
       		    return h;
       		}
        
        void set_h(float _h)
        	{
        		h=_h;
        	} 
        
        virtual float Area()
        	{
				return (b*h)/2;     
        	}   
        
        virtual float Perimetro()  
			{
				return 3*b;     
        	} 
};

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Rafael Filho Macedo Olá. Rodei o código aqui e está tudo ok! A questão é como você está criando seus arquivos, provavelmente.

 

Vou passar os arquivos .h e .cpp da classe Square para você poder comparar:

 

arquivo Square.h

 

#pragma once

#include "Shape.h"

class Square :public Shape
{
public:
    Square();
    ~Square();
    Square(float x);
    float get_Lado();
    void set_Lado(float x);
    float Area();
    float Perimetro();

private:
    float Lado;
};

Arquivo Square.cpp

#include "Square.h"


Square::Square()
{

}


Square::~Square()
{

}

Square::Square(float x) {
    this->Lado = x;
}

float Square::get_Lado() {
    return this->Lado;
}

void Square::set_Lado(float x) {
    this->Lado = x;
}

float Square::Area() {
    return Lado * Lado;
}

float Square::Perimetro() {
    return Lado * 4;
}

Perceba a diferença em como crio os arquivos.

 

adicionado 1 minuto depois

Obs: Os métodos getters e setters não estão sendo usados

Editado por giu_d
Correção no código

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Rafael Filho Macedo Vou aproveitar e já passar o código todo já q modifiquei todo ele.

Os arquivos Square.h e Square.cpp já passei.

Então segue a sequência do projeto:

 

Arquivo Triangle.h

#pragma once

#include "Shape.h"

class Triangle : public Shape
{
public:
    Triangle();
    Triangle(float _b, float _h);
    ~Triangle();
    float get_b();
    void set_b(float _b);
    float get_h();
    void set_h(float _h);
    float Area();
    float Perimetro();

private:
    float b;
    float h;
};

Arquivo Triangle.cpp

#include "Triangle.h"


Triangle::Triangle()
{

}

Triangle::Triangle(float _b, float _h) {
    this->b = _b;
    this->h = _h;
}


Triangle::~Triangle()
{

}

float Triangle::get_b() {
    return this->b;
}

void Triangle::set_b(float _b) {
    this->b = _b;
}

float Triangle::get_h() {
    return this->h;
}

void Triangle::set_h(float _h) {
    this->h = _h;
}

float Triangle::Area() {
    return (b * h) / 2;
}

float Triangle::Perimetro() {
    return 3 * b;
}

Arquivo Circle.h

#pragma once

#include "Shape.h"

class Circle : public Shape
{
public:
    Circle();
    ~Circle();
    Circle(float x);
    float get_r();
    void set_r(float _r);
    float Area();
    float Perimetro();
	

private:
    float r;
};

Arquivo Circle.cpp

#include "Circle.h"


Circle::Circle()
{

}


Circle::~Circle()
{

}

Circle::Circle(float x) {
    this->r = x;
}

float Circle::get_r() {
    return this->r;
}

void Circle::set_r(float _r) {
    this->r = _r;
}

float Circle::Area() {
    return 3.14 * r * r;
}

float Circle::Perimetro() {
    return 2 * 3.14 * r;
}

Arquivo Rectangle.h

#pragma once

#include "Shape.h"

class Rectangle : public Shape
{
public:
    Rectangle();
    ~Rectangle();
    Rectangle(float _b, float _h);
    float get_b();
    void set_b(float _b);
    float get_h();
    void set_h(float _h);
    float Area();
    float Perimetro();

private:
    float b;
    float h;
};

Arquivo Rectangle.cpp

#include "Rectangle.h"


Rectangle::Rectangle()
{

}


Rectangle::~Rectangle()
{

}


Rectangle::Rectangle(float _b, float _h) {
    this->b = _b;
    this->h = _h;
}

float Rectangle::get_b() {
    return this->b;
}

void Rectangle::set_b(float _b) {
    this->b = _b;
}

float Rectangle::get_h() {
    return this->h;
}

void Rectangle::set_h(float _h) {
    this->h = _h;
}

float Rectangle::Area() {
    return b * h;
}

float Rectangle::Perimetro() {
    return (2 * h) + (2 * b);
}

 

Arquivo Shape.h

#pragma once
class Shape
{
public:	
    virtual float Area() = 0;
    virtual float Perimetro() = 0;
};

Arquivo principal.cpp

 

#include <iostream>
#include <locale.h>
using namespace std;

#include "Shape.h"
#include "Square.h"
#include "Rectangle.h"
#include "Circle.h"
#include "Triangle.h"


int main()
{
    setlocale(LC_ALL, "");

    Shape *S4[4];
    S4[0] = new Square(10);
    S4[1] = new Rectangle(4, 6);
    S4[2] = new Triangle(2, 3);
    S4[3] = new Circle(4);




    cout << "=========================== DADOS QUADRADO ==================================" << endl;
    cout << endl;
    cout << "Area do Quadrado = " << S4[0]->Area() << " metros quadrados!" << endl;
    cout << "Perimetro do Quadrado = " << S4[0]->Perimetro() << " metros!" << endl;
    cout << endl;
    cout << "=========================== DADOS RETANGULO =================================" << endl;
    cout << endl;
    cout << "Area do Retangulo = " << S4[1]->Area() << " metros quadrados!" << endl;
    cout << "Perimetro do Retangulo = " << S4[1]->Perimetro() << " metros!" << endl;
    cout << endl;
    cout << "=========================== DADOS TRIANGULO =================================" << endl;
    cout << endl;
    cout << "Area do Triangulo = " << S4[2]->Area() << " metros quadrados!" << endl;
    cout << "Perimetro do Triangulo = " << S4[2]->Perimetro() << " metros!" << endl;
    cout << endl;
    cout << "=========================== DADOS CIRCULO ===================================" << endl;
    cout << endl;
    cout << "Area do Circulo = " << S4[3]->Area() << " metros quadrados!" << endl;
    cout << "Perimetro do Circulo = " << S4[3]->Perimetro() << " metros!" << endl;
    cout << endl;
    cout << "=============================    FIM   ======================================" << endl;
	
    system("pause >> null ");	

    return 0;
}

Vê se roda certinho. Aqui tá tudo ok! Criei o projeto no Visual Studio

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, giu_d disse:

@Rafael Filho Macedo Vou aproveitar e já passar o código todo já q modifiquei todo ele.

Os arquivos Square.h e Square.cpp já passei.

Então segue a sequência do projeto:

 

Arquivo Triangle.h


#pragma once

#include "Shape.h"

class Triangle : public Shape
{
public:
    Triangle();
    Triangle(float _b, float _h);
    ~Triangle();
    float get_b();
    void set_b(float _b);
    float get_h();
    void set_h(float _h);
    float Area();
    float Perimetro();

private:
    float b;
    float h;
};

Arquivo Triangle.cpp


#include "Triangle.h"


Triangle::Triangle()
{

}

Triangle::Triangle(float _b, float _h) {
    this->b = _b;
    this->h = _h;
}


Triangle::~Triangle()
{

}

float Triangle::get_b() {
    return this->b;
}

void Triangle::set_b(float _b) {
    this->b = _b;
}

float Triangle::get_h() {
    return this->h;
}

void Triangle::set_h(float _h) {
    this->h = _h;
}

float Triangle::Area() {
    return (b * h) / 2;
}

float Triangle::Perimetro() {
    return 3 * b;
}

Arquivo Circle.h


#pragma once

#include "Shape.h"

class Circle : public Shape
{
public:
    Circle();
    ~Circle();
    Circle(float x);
    float get_r();
    void set_r(float _r);
    float Area();
    float Perimetro();
	

private:
    float r;
};

Arquivo Circle.cpp


#include "Circle.h"


Circle::Circle()
{

}


Circle::~Circle()
{

}

Circle::Circle(float x) {
    this->r = x;
}

float Circle::get_r() {
    return this->r;
}

void Circle::set_r(float _r) {
    this->r = _r;
}

float Circle::Area() {
    return 3.14 * r * r;
}

float Circle::Perimetro() {
    return 2 * 3.14 * r;
}

Arquivo Rectangle.h


#pragma once

#include "Shape.h"

class Rectangle : public Shape
{
public:
    Rectangle();
    ~Rectangle();
    Rectangle(float _b, float _h);
    float get_b();
    void set_b(float _b);
    float get_h();
    void set_h(float _h);
    float Area();
    float Perimetro();

private:
    float b;
    float h;
};

Arquivo Rectangle.cpp


#include "Rectangle.h"


Rectangle::Rectangle()
{

}


Rectangle::~Rectangle()
{

}


Rectangle::Rectangle(float _b, float _h) {
    this->b = _b;
    this->h = _h;
}

float Rectangle::get_b() {
    return this->b;
}

void Rectangle::set_b(float _b) {
    this->b = _b;
}

float Rectangle::get_h() {
    return this->h;
}

void Rectangle::set_h(float _h) {
    this->h = _h;
}

float Rectangle::Area() {
    return b * h;
}

float Rectangle::Perimetro() {
    return (2 * h) + (2 * b);
}

 

Arquivo Shape.h


#pragma once
class Shape
{
public:	
    virtual float Area() = 0;
    virtual float Perimetro() = 0;
};

Arquivo principal.cpp

 


#include <iostream>
#include <locale.h>
using namespace std;

#include "Shape.h"
#include "Square.h"
#include "Rectangle.h"
#include "Circle.h"
#include "Triangle.h"


int main()
{
    setlocale(LC_ALL, "");

    Shape *S4[4];
    S4[0] = new Square(10);
    S4[1] = new Rectangle(4, 6);
    S4[2] = new Triangle(2, 3);
    S4[3] = new Circle(4);




    cout << "=========================== DADOS QUADRADO ==================================" << endl;
    cout << endl;
    cout << "Area do Quadrado = " << S4[0]->Area() << " metros quadrados!" << endl;
    cout << "Perimetro do Quadrado = " << S4[0]->Perimetro() << " metros!" << endl;
    cout << endl;
    cout << "=========================== DADOS RETANGULO =================================" << endl;
    cout << endl;
    cout << "Area do Retangulo = " << S4[1]->Area() << " metros quadrados!" << endl;
    cout << "Perimetro do Retangulo = " << S4[1]->Perimetro() << " metros!" << endl;
    cout << endl;
    cout << "=========================== DADOS TRIANGULO =================================" << endl;
    cout << endl;
    cout << "Area do Triangulo = " << S4[2]->Area() << " metros quadrados!" << endl;
    cout << "Perimetro do Triangulo = " << S4[2]->Perimetro() << " metros!" << endl;
    cout << endl;
    cout << "=========================== DADOS CIRCULO ===================================" << endl;
    cout << endl;
    cout << "Area do Circulo = " << S4[3]->Area() << " metros quadrados!" << endl;
    cout << "Perimetro do Circulo = " << S4[3]->Perimetro() << " metros!" << endl;
    cout << endl;
    cout << "=============================    FIM   ======================================" << endl;
	
    system("pause >> null ");	

    return 0;
}

Vê se roda certinho. Aqui tá tudo ok! Criei o projeto no Visual Studio

Cara, quando você rodou o meu código sem alterá-lo, o resultado de área é perímetro do círculo, triângulo e retângulo deram diferente de zero? porque aqui só deu 0 na área e perímetro, com exceção do quadrado. Mas vou testar seu código pra ver se vai rodar agora. Ah, como você faz pra acessar o get e ser pra alterar os valores. Eu tentei S4[2]->set_lado(20); mas não funcionou no meu primeiro código. @giu_d

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Rafael Filho Macedo Olá. Testei seu código sim. Realmente está dando o erro q você mencionou. Estranho isso. 

Já do modo como fiz tudo ok, código funcionando. Testa aí para ver se dá certo

Quanto a questão de acessar os métodos getters e setters do modo como você instanciou os objetos não dá não.

O objeto S4[2], por exemplo, só tem acesso aos métodos Area e Perimetro

adicionado 22 minutos depois

 

@Rafael Filho Macedo O erro está no construtor parametrizável  das classes (não é o construtor padrão).

Segue o código ajustado e perceba a diferença:

Square (float x)
{
    this->Lado = x;
}
Rectangle (float _b, float _h)
{
    this->b = _b;
    this->h = _h;
}
Circle (float x)
{
    this->r = x;
}
Triangle (float _b, float _h)
{
    this->b = _b;
    this->h = _h;
}

O operador this diz respeito ao atributo da classe. É só mudar nessas partes dos códigos q passei e já resolve o problema no seu código :thumbsup: 

 

O Construtor padrão seria esse:

Triangle()
{

}

Ou, usando a sintaxe q estou usando:

Rectangle::Rectangle()
{

}

 

Editado por giu_d
corrigir comentário

Compartilhar este post


Link para o post
Compartilhar em outros sites

@giu_d Só mais um detalhe, no caso se eu quiser usar set_Lado, eu vou ter que criar ela dentro do Shape, certo?

 

Eu queria entender também se eu posso fazer o seguinte, só em pseudo linguagem pra você captar o que eu quero fazer.

 

S4[0]->set_Lado(100);

float Teste = S4[0]->get_Lado();

 

quero criar uma variavel pra receber o valor de Lado.

 

e na hora de escrever queria saber se é possivel fazer isso: S4[0]->Area(Teste)

de forma que ele calcule a area com o valor da variavel ali, porque se der, quero preencher os valores pelo teclado.

 

Dai faria:

 

cout << "Defina Lado: ";

cin >> Teste;

cout << S4[0]->Area(Teste);

 

isso é possivel?

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Rafael Filho Macedo Perceba o seguinte: Você não instanciou os objetos como sendo de alguma classe como Circle, Square, Triangle ou Rectangle. 

Você instanciou os objetos como sendo da classe Shape. Logo, os únicos métodos q a classe Shape tem q são implementados nas outras classes são os métodos Area e Perimetro.

Dá para você fazer o que mencionou: armazenar em uma variável o valor retornado pelo método getLado, só que teria q mudar a forma de instanciar os objetos de cada classe. Seque um exemplo:

 

float valor;
Square *square = new Square(); // aqui está sendo chamado o construtor padrão
square->set_Lado(10);
valor = square->Area();

cout << valor << endl;

delete square; // libera a memória alocada para o objeto

Ou como mencionou:

float valor;
Square *square = new Square(); // aqui está sendo chamado o construtor padrão
    
cout << "Defina Lado: ";
cin >> valor;
square->set_Lado(valor);

Quanto a fazer algo como square->Area(valor); já não daria. O método Area não recebe parâmetro nenhum. A não ser que você criasse um método para calcular a área que recebe um ou mais parâmetro. Aí sim daria p fazer isso

Ou algo assim:

cout << "Defina Lado: ";
cin >> valor;
Square *square = new Square(valor);
cout << square->Area() << endl;
delete square; // libera a memória alocada para o objeto

Se deu para ajudar um pouco ótimo. Qualquer coisa pergunta, ok?

adicionado 6 minutos depois

Ou algo assim:

float valor;
Square square;

cout << "Defina Lado: ";
cin >> valor;
square.set_Lado(valor); // assim se usa o ponto e não a seta

cout << square.Area() << endl;

E por aí vai. Para aprender sobre trabalhar com orientação a objetos é preciso praticar bastante!

adicionado 17 minutos depois

Algoritmos.zip

Olá. No link acima estão dois jogos q criei. Jogo da Forca e Joga da Velha usando orientação a objetos.

Creio q vai ajudar para q você entenda um pouco mais sobre OO

Abraço!

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×