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

C++ Erro na hora de implementar sub classes

Recommended Posts

Olá, pessoal. Então, eu to tentando implementar todos os métodos das subclasses e usar numa aplicação simples, mas esta apresentando alguns erros que eu não estou conseguindo arrumar. Segue abaixo o arquivo "Shape.h" e o cpp com uma aplicação usando essas classes(pode alterar a aplicação, é só pra demonstrar o uso).

 

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


// ==== class Point =============================================================================
class Point
{
   // Atributos 
   protected:
	   float _x;
	   float _y;
   // Metodos
   public:
   // construtor
   Point(float x,float y); //construtor default
   Point(); // construtor sobrecarregado
   //metodos de acesso
   void set_x(float x);
   float get_x();
   void set_y(float y);
   float get_y();
   // outros metodos
   void set_coord(float x,float y);
   float distance(Point *p);
   Point new_Point(float dx,float dy);
   
};
   	
	  Point::Point(float x,float y)
	   {
	   	    _x = x;
	   	    _y = y;
	   }
   
       Point::Point()
	   {
	   	    _x = 0;
	   	    _y = 0;
	   }
   //metodos de acesso
	    void Point::set_x(float x)
		{
		   _x = x;
		}
		
		float Point::get_x()
		{
		   return _x;
		}
		
		void Point::set_y(float y)
		{
		   _y = y;
		}
		
		float Point::get_y()
		{
		   return _y;
		}
	
	void Point::set_coord(float x,float y)
	{
		_x = x;
		_y = y;
	}

	float Point::distance(Point *p)
	{
	  float d;
	  d = sqrt(pow((_x - p->get_x()),2) + pow((_y - p->get_y()),2));
	  return d;
	}
	
	Point Point::new_Point(float dx,float dy)
	{
	    Point novoPonto(_x + dx, _y + dy);
		return novoPonto;
	}
	
	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	
	
//===== classe Line ===================================================================
class Line:public Point
{
   // atributos 
   private:
   float _d;
   char color[10];
   // metodo construtor
   public:
   Line(float x, float y, char *cor);
   Line();
   
   // Metodos
   void set_d(Point *p[2]);
   float get_d();
    
	
};

Line::Line(float x, float y, char *cor):Point(x,y)
{
       strcpy(color,cor);    
}


//............................


void Line::set_d(Point *p[2])
{
	_d = p[0]->distance(p[1]);	
}
	
float Line::get_d()
{
	return _d;
}

////////////////////////////////////////////////////////////


// ==== classe Circle	 ===================================================================
class Circle:public Point
{
	// atributos
	private:
	float _r;
	char color[10];
	
	public:
	// metodo construtor
	Circle(float x, float y, const char *cor);
	Circle();
	// metodos
	void set_raio(Point *p[2]);
	float get_raio();
	void set_color(char *cor);
	void get_color(char *cor);
	float get_area();
	float get_perimeter();
	
};

Circle::Circle(float x, float y, const char *cor):Point(x,y)
{
	strcpy(color,cor);
}

Circle::Circle():Point()
{
	strcpy(color,"Sem cor");
}

void Circle::set_raio(Point *p[2])
{
	_r = p[0]->distance(p[1]);
}

float Circle::get_raio()
{
	return _r;
}

void Circle::set_color(char *cor)
{
     	strcpy(color,cor);
}

void Circle::get_color(char *cor)
{
     	strcpy(cor,color);
}

float Circle::get_area()
{
	float area = 3.14 * _r * _r;
	return area;
}

float Circle::get_perimeter()
{
	float perimeter = 2 * 3.14 * _r;
	return perimeter;
}


//...................................


// ==== classe Square  ===================================================================
class Square:public Point
{
  // atributos
  float _l;
  float _d;
  char color[10];
  // metodo construtor
  Square(float x,float y, char *cor);
  Square();

  // methods
  void set_diagonal(Point *p[2]);
  float get_diagonal();
  void set_lado(Point p);
  float get_lado();
  void set_color(char *cor);
  void get_color(char *cor);
  float area();
  float perimeter();
  
};
 
 Square::Square(float x,float y, char *cor):Point(x,y)
 {
 	strcpy(color,cor);
 }
 
 Square::Square():Point()
{
	strcpy(color,"Sem cor");
}
 
float Square::get_diagonal()
{
	float diagonal = sqrt((_l*_l)+(_l*_l)); 
	return diagonal;
}


void Square::set_diagonal(Point *p[2])
{

_d = p[0]->distance(p[1]);

}


void Square::set_lado(Point p)
{
	_l = p;
}

float Square::get_lado()
{
	return _l;
}

void Square::set_color(char *cor)
{
     	strcpy(color,cor);
}

void Square::get_color(char *cor)
{
     	strcpy(cor,color);
}

float Square::area()
{
	float area = _l*_l;
	return area;
}

float Square::perimeter()
{
    float perimeter = _l*4;
    return perimeter;
}
 //..............................
 
 
 
// ==== classe Rectangle   ===================================================================
class Rectangle:public Point
{
  // atributos
 float _h;
 float _b;
 char color[10];
  // metodo construtor
  Rectangle(float x, float y, char *cor);
  Rectangle();
  // methods
   void set_altura(Point *p[2]);
   float get_altura();
   void set_base(Point *p[2]);
   float get_base();
   void set_color(char *cor);
   void get_color(char *cor);
   float area();
   float perimeter();
    
};  
   
   Rectangle::Rectangle(float x, float y, char *cor):Point(x,y)
	   {
	   	    color = "Sem cor";
	   }
   
       Rectangle::Rectangle()
	   {
	   	    _h = 0;
	   	    _b = 0;
	   }
   
void Rectangle::set_altura(float x){
        _h = x;
}
   
float Rectangle::get_altura(){
         return _h;
         }
         
void Rectangle::set_base(float y){
        _b = y;
}
   
float Rectangle::get_base(){
   	
        return _b;
}
   
void Rectangle::set_color(char *cor)
{
     	strcpy(color,cor);
}

void Rectangle::get_color(char *cor)
{
     	strcpy(cor,color);
}

float Rectangle::area()
{
	float area = _b * _h;
	return area;
}

float Rectangle::perimeter()
{
	float perimeter = 2*(_b + _h);
	return perimeter;
}


//....................................


// ===== classe Triangle   ===================================================================
class Triangle:public Point
{
	// atributos
	float _a;
	float _b;
	float _c;
	char color[10];
	// metodo construtor
	Triangle(float x, float y, char *cor);
	Triangle();
	// metodo
	void set_a(Point *p[2]);
	float get_a();
	void set_b(Point *p[2]);
	float get_b();
	void set_c(Point *p[2]);
    float get_c();
    void set_color(char *cor);
	void get_color(char *cor);
    void set_lados(Point *p[2]);
    float get_area();
    float get_perimeter();
    
};

Triangle::Triangle(float x, float y, char *cor):Point(x,y)
{
	strcpy(color,cor);
}

Triangle::Triangle()
{
	_a = 0;
	_b = 0;
	_c = 0;
	color = "Sem cor";
}

void Triangle::set_a(float x)
{
	_a = x;
}

float Triangle::get_a()
{
	return _a;
}

float Triangle::get_b()
{
	return _b;
}

void Triangle::set_b(float y)
{
	_b = x;
}


void Triangle::set_c(float z)
{
	_c = z;
}

float Triangle::get_c()
{
	return _c;
}

void Triangle::set_color(char *cor)
{
     	strcpy(color,cor);
}

void Triangle::get_color(char *cor)
{
     	strcpy(cor,color);
}

void Triangle::set_lados(Point *p[2])
{
 	_a = p[0];
	_b = p[1];
    _c = p[3];
}

float Triangle::get_area()
{
	float area = (_a * _b)/2);
	return area;
}

float Triangle::get_perimeter()
{
	float perimeter = _a + _b + _c;
	return perimeter;
}

//.........................................
#include <iostream>
#include "myShapes.h"

using namespace std;

// Programa principal

int main() {
    Point p1(5, 2);
    Point p2(2, 5);
    Point p3;

    cout << p1.get_x() << endl;
    cout << p1.get_y() << endl;

    cout << "Distancia: " << p1.distance(p2) << endl;

    p3 = p1.new_Point(5, 5);

    cout << p3.get_x() << endl;
    cout << p3.get_y() << endl;

    system("pause");

    return 0;
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
#include <iostream>
#include <string.h>
#define MAX_DISC 10
#define MAX_STR 80

using namespace std;

//////////////////////////
class pessoa
{
      private:
              char nome[MAX_STR];
              char endereco[MAX_STR];
              char nasc[10];
              
      public:
             pessoa (const char *nom, const char *end, const char *d_nasc);
             void AtualizarEndereco (const char *end){strcpy(endereco,end);}
             void LerDadosPessoais (char *n, char *end,char *d_nasc);
             double LerSalario (void);             
}; 

pessoa::pessoa (const char *nom, const char *end, const char *d_nasc)
{
                     strcpy(nome,nom);
                     strcpy(endereco,end);
                     strcpy(nasc,d_nasc);
}
void pessoa::LerDadosPessoais (char *n, char *end,char *d_nasc)
{
     strcpy(n,nome);
     strcpy(end,endereco);
     strcpy(d_nasc,nasc);
}

////////////////////////////////////
class professor:public pessoa
{
      private:
              int grau;
              int disciplinas[MAX_DISC];
              int area;
              int n_disc;
      public:
             professor(const char *n, const char *e, const char *dn, int g, int a);
             void IncluirGrau (int g){grau=g;}
             void IncluirDisciplinas (int nd, const int *disc)
             {   n_disc=nd;
             for(int i=0; i<n_disc; i++) disciplinas[i]=disc[i];
             }
             void IncluirArea (int a){area=a;}
             void LerDadosAcademicos (int *g, int *disc, int *a);
      }; 
      
professor::professor (const char *n, const char *e, const char *dn, int g, int a):pessoa(n,e,dn)
{
                     grau=g;
                     area=a;
                     n_disc=0;;
                     for(int i=0; i<MAX_DISC; i++) disciplinas[i]=0;
}
void professor::LerDadosAcademicos (int *g, int *disc, int *a)
{
     *g=grau; *a=area;
     for(int i=0; i<n_disc; i++) disciplinas[i]=disc[i];
}

////////////////////////////////////////////////
class aluno:public pessoa
{
      private:
              int matricula;
              int curso;
              int disciplinas[MAX_DISC];
              int notas[MAX_DISC];
              int n_disc;
      public:
             aluno(const char *n, const char *e, const char *dn, int m, int c);
             void Matricular(int nd, const int *d);
             void IncluirNotas (const int *n){for(int i=0;i<n_disc;i++)notas[i]=n[i];}
             int LerMatricula (void){return matricula;}
             int LerCurso (void){return curso;}
             void LerNotasDisc (int *n, int *d);
      }; 
      
aluno::aluno (const char *n, const char *e, const char *dn, int m, int c):pessoa(n,e,dn)
{
                     matricula=m;
                     curso=c;
                     n_disc=0;;
                     for(int i=0; i<MAX_DISC; i++) disciplinas[i]=0;
}

void aluno::Matricular (int nd, const int *disc)
{
    n_disc=nd;
    for(int i=0; i<n_disc; i++) disciplinas[i]=disc[i];     
   

}
void aluno::LerNotasDisc (int *n, int *d)
{
     int i;
     for (i=0;i<n_disc;i++)
     {
         n[i]=notas[i];
         d[i]=disciplinas[i];
     }
}

////////////////////////////////////////
class funcionario:public pessoa{
      private:
              float salario;
              int depto;
              int cargo;
      public:
             funcionario (const char *n, const char *e, const char *dn, float s, int d, int c); 
             void AlterarSalario(float s){salario=s;}
             void AlterarDepto (int d){depto=d;}
             void AlterarCargo(int c){cargo=c;}
             float LerSalario (void){return salario;}
             int LerDepto (void){return depto;}
             int LerCargo (void){return cargo;}
}; 

funcionario::funcionario (const char *n, const char *e, const char *dn, float s, int d, int c):pessoa(n,e,dn)
{
    salario=s;
    depto=d;
    cargo=c;
}

 

Eu comecei implementando algumas classes, mas fora as que estão ai, sempre ta ocorrendo erro se tento implementar mais. Alguem poderia me ajudar a implementar essas classes?

Editado por DiF
Não pode apagar o conteúdo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Rafael Filho Macedo Por gentileza, poste aqui a sua solução encontrada. Assim poderás ajudar os outros que estiverem com a mesma dúvida.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Rafael Filho Macedo Olá. Percebi q postou outro código (!?) 

OBS: Sempre espere aparecer uma resposta a dúvida q você tem para daí postar algo novo. Ou, se tem um outro código com problema, abra um novo tópico!

Quanto ao primeiro projeto é o seguinte: Deu para ajustar aqui. Só q gostaria de dar uma dica.

Você está trabalhando com o C++, e no C++ tem a classe string. Para fazer uso dessa classe só é preciso incluir a biblioteca <string> no projeto.

Por isso não é mais preciso fazer algo assim:

char color[10];

Você já pode usar a classe string e fazer a mesma coisa dessa forma:

string color;

No método getColor ficaria assim:

string Triangle::get_color()
{
    return color;
}

E por aí vai. Vou postar o código. Mas devo adiantar q preciso analisar melhor o código. 

Mas como tenho q sair depois vou postar como está. Aqui tá compilando e aparentemente funcionando corretamente

Segue o código:

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


// ==== class Point =============================================================================
class Point
{
    // Atributos
protected:
    float _x;
    float _y;
    // Metodos
public:
    // construtor
    Point(float x,float y); //construtor default
    Point(); // construtor sobrecarregado
    //metodos de acesso
    void set_x(float x);
    float get_x();
    void set_y(float y);
    float get_y();
    // outros metodos
    void set_coord(float x,float y);
    float distance(Point *p);
    Point new_Point(float dx,float dy);

};

Point::Point(float x,float y)
{
    _x = x;
    _y = y;
}

Point::Point()
{
    _x = 0;
    _y = 0;
}
//metodos de acesso
void Point::set_x(float x)
{
    _x = x;
}

float Point::get_x()
{
    return _x;
}

void Point::set_y(float y)
{
    _y = y;
}

float Point::get_y()
{
    return _y;
}

void Point::set_coord(float x,float y)
{
    _x = x;
    _y = y;
}

float Point::distance(Point *p)
{
    float d;
    d = sqrt(pow((_x - p->get_x()),2) + pow((_y - p->get_y()),2));
    return d;
}

Point Point::new_Point(float dx,float dy)
{
    Point novoPonto(_x + dx, _y + dy);
    return novoPonto;
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


//===== classe Line ===================================================================
class Line:public Point
{
    // atributos
private:
    float _d;
    string color;
    // metodo construtor
public:
    Line(float x, float y, string cor);
    Line();

    // Metodos
    void set_d(Point *p[2]);
    float get_d();


};

Line::Line(float x, float y, string cor):Point(x,y)
{
    color = cor;
}


//............................


void Line::set_d(Point *p[2])
{
    _d = p[0]->distance(p[1]);
}

float Line::get_d()
{
    return _d;
}

////////////////////////////////////////////////////////////


// ==== classe Circle	 ===================================================================
class Circle:public Point
{
    // atributos
private:
    float _r;
    string  color;

public:
    // metodo construtor
    Circle(float x, float y, string cor);
    Circle();
    // metodos
    void set_raio(float _r);
    float get_raio();
    void set_color(string cor);
    string get_color();
    float get_area();
    float get_perimeter();

};

Circle::Circle(float x, float y, string cor) : Point( x, y)
{
    color = cor;
}

Circle::Circle() : Point()
{
    color = "Sem cor";
}

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

float Circle::get_raio()
{
    return _r;
}

void Circle::set_color(string cor)
{
    color = cor;
}

string Circle::get_color()
{
    return color;
}

float Circle::get_area()
{
    float area = 3.14 * _r * _r;
    return area;
}

float Circle::get_perimeter()
{
    float perimeter = 2 * 3.14 * _r;
    return perimeter;
}


//...................................


// ==== classe Square  ===================================================================
class Square : public Point
{
    // atributos
private:
    float _l;
    float _d;
    string color;
public:
    // metodo construtor
    Square(float x,float y, string cor);
    Square();

    // methods
    void set_diagonal(Point *p[2]);
    float get_diagonal();
    void set_lado(Point p);
    float get_lado();
    void set_color(string cor);
    string get_color();
    float area();
    float perimeter();

};

Square::Square(float x,float y, string cor):Point(x,y)
{
    color = cor;
}

Square::Square():Point()
{
    color = "Sem cor";
}

float Square::get_diagonal()
{
    float diagonal = sqrt((_l*_l)+(_l*_l));
    return diagonal;
}


void Square::set_diagonal(Point *p[2])
{

    _d = p[0]->distance(p[1]);

}


void Square::set_lado(Point p)
{
    //_l = p;
}

float Square::get_lado()
{
    return _l;
}

void Square::set_color(string cor)
{
    color = cor;
}

string Square::get_color()
{
    return color;
}

float Square::area()
{
    float area = _l*_l;
    return area;
}

float Square::perimeter()
{
    float perimeter = _l * 4;
    return perimeter;
}
//..............................



// ==== classe Rectangle   ===================================================================
class Rectangle:public Point
{
    // atributos
private:
    float _h;
    float _b;
    string color;
    // metodo construtor
public:
    Rectangle(float x, float y, string cor);
    Rectangle();
    // methods
    void set_altura(float x);
    float get_altura();
    void set_base(float y);
    float get_base();
    void set_color(string cor);
    string get_color();
    float area();
    float perimeter();

};

Rectangle::Rectangle(float x, float y, string cor):Point(x,y)
{
    this->color = cor;
    this->_h = x;
    this->_b = y;
}

Rectangle::Rectangle()
{
    //_h = 0;
    //_b = 0;
}

void Rectangle::set_altura(float x) {
    _h = x;
}

float Rectangle::get_altura() {
    return _h;
}

void Rectangle::set_base(float y) {
    _b = y;
}

float Rectangle::get_base() {

    return _b;
}

void Rectangle::set_color(string cor)
{
    color = cor;
}

string Rectangle::get_color()
{
    return this->color;
}

float Rectangle::area()
{
    float area = this->_b * this->_h;
    return area;
}

float Rectangle::perimeter()
{
    float perimeter = 2*(_b + _h);
    return perimeter;
}


//....................................


// ===== classe Triangle   ===================================================================
class Triangle:public Point
{
    // atributos
private:
    float _a;
    float _b;
    float _c;
    string color;
    // metodo construtor
public:
    Triangle(float x, float y, string cor);
    Triangle();
    // metodo
    void set_a(float a);
    float get_a();
    void set_b(float b);
    float get_b();
    void set_c(float c);
    float get_c();
    void set_color(string cor);
    string get_color();
    void set_lados(Point *p);
    float get_area();
    float get_perimeter();

};

Triangle::Triangle(float x, float y, string cor):Point(x,y)
{
    color = cor;
}

Triangle::Triangle()
{
    _a = 0;
    _b = 0;
    _c = 0;
    color = "Sem cor";
}

void Triangle::set_a(float a)
{
    _a = a;
}

float Triangle::get_a()
{
    return _a;
}

float Triangle::get_b()
{
    return _b;
}

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


void Triangle::set_c(float c)
{
    _c = c;
}

float Triangle::get_c()
{
    return _c;
}

void Triangle::set_color(string cor)
{
    color = cor;
}

string Triangle::get_color()
{
    return color;
}

void Triangle::set_lados(Point *p)
{
    //_a = p[0].get_x();
    //_b = p[1].get_x();
    //_c = p[3].get_x();
}

float Triangle::get_area()
{
    float area = ((_a * _b) / 2);
    return area;
}

float Triangle::get_perimeter()
{
    float perimeter = _a + _b + _c;
    return perimeter;
}

//.........................................

//.........................................

int main() {

    Point *p1 = new Point(5, 2);
    Point *p2 = new Point(2, 5);
    Point p3;

    Rectangle *r = new Rectangle(4, 8, "Azul");

    Circle *c = new Circle();
    c->set_color("Verde");
    c->set_raio(5);

    cout << "Circulo\n" << endl;
    cout << "cor: " << c->get_color() << endl;
    cout << "Area: " << c->get_area() << endl;
    cout << "Perimetro: " << c->get_perimeter() << endl;

    cout << endl;

    cout << "Retangulo\n" << endl;
    cout << "Cor: " << r->get_color() << endl;
    cout << "Area: " << r->area() << endl;
    cout << "Perimetro: " << r->perimeter() << endl;

    cout << endl;

    cout << p1->get_x() << endl;
    cout << p1->get_y() << endl;

    cout << endl;

    cout << "Distancia: " << p1->distance(p2) << endl;

    p3 = p1->new_Point(5, 5);

    cout << endl;

    cout << p3.get_x() << endl;
    cout << p3.get_y() << endl;

    cout << endl;

    delete p1;

    delete p2;

    delete r;

    delete c;

    system("pause");

    return 0;
}

Dá uma verificada para ver se está funcionando corretamente. Qualquer coisa avisa, ok?

Compartilhar este post


Link para o post
Compartilhar em outros sites

@giu_d

 

Cara, continua o erro em funções como essa:

 

void Triangle::set_lados(Point *p) {

//_a = p[0].get_x();

//_b = p[1].get_x();

//_c = p[3].get_x();

}

 

Quase todas que tem o Point *p ou Point p[] no parâmetro está dando erro. É isso que não estou entendendo e sabendo arrumar... 

Editado por Rafael Filho Macedo
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Rafael Filho Macedo É. Nessa parte q você postou aí até deixei comentado pois está dando erro mesmo.

Sinceramente não tô entendendo o q você quer nessa parte do código.

Perceba o seguinte nessa parte do código abaixo:

void Line::set_d(Point *p[2]) // você está fazendo assim
{
    _d = p[0]->distance(p[1]);	
}
	
float Line::get_d()
{
    return _d;
}

Só q no método set_d não tem como dar certo isso. Perceba q _d é um atributo da classe Line e é do tipo float. Logo, o maneira correto é usar como parâmetro um tipo de dado float.

Logo, o código correto, nesse caso, seria isso:

void Line::set_d(float a)
{
    this->_d = a;
}

Eu falei q não analisei devidamente o código quando postei. Cheguei agora há pouco em casa

Nesse método, o q você deve fazer é passar um valor do tipo float como parâmetro quando chamar o método para q _d passe a valer esse valor q foi passado. O nome já diz o q deve ser feito: setar o valor de _d. Tal como no método get_d, é capturar o valor de _d. Deu para entender a lógica? Se _d fosse do tipo Point aí seria outra história. Mas é do tipo float amigo. E esse tipo de coisa você está fazendo em todos os métodos getters e setters

Outro ponto: esse parâmetro:

Point *p[2] // aqui se trata de uma matriz bidimensional

Procure entender a respeito dos métodos getters e setters e aí avançamos, ok?

Até no seu código tem métodos get_Tal q você coloca parâmetros (!?)

OBS: Tem um ponto importante para frisar. Não adianta definir os atributos de uma classe como sendo privados e aí criar métodos getters e setters p tudo. Não faz sentido isso

Editado por giu_d
corrigir comentário

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

×