Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
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






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

×