Ir ao conteúdo
  • Cadastre-se

C++ vetores de objetos e sobrecarga de operadores


Amanda Kellen

Posts recomendados

Preciso criar um vetor de objetos,porém meu código está imprimindo de maneira errada esse vetor.Não entendo muito bem como funciona esse vetor de objetos,alguém poderia me explicar?segque abaixo o código.Além disso tentei sobrecarregar o operador << e está dando erro.

#ifndef SEQ_H
#define SEQ_H
#include <vector>
#include <iostream>
#include<stdlib.h>
  using namespace std;

class seq
{
     
	
	protected:
    virtual void gen_elems(int )=0 ;// Gera os elementos da série até o iésimo elemento (protected)
    
    
     public:
     	  vector <unsigned long int>  sequencia; 
     	   vector<seq *> SEQ;
     	 int length() ;// Retorna o tamanho atual da série
     	 void print(ostream &os); // Escreve todos os elementos gerados em os (public)
  	 	unsigned long int elem(int ); // Retorna o iésimo elemento da seqüência (public)
  	 	void imprime1(int ,int);//Imprime sequencia de i até j
  	 	int elemento();
  	 	void imprime_termo(int );
  	 	void menu(seq *);
  	 	void colocat(seq *);
  	 	void imprimep(seq *);
  	 	//void operator <<( ostream &o, seq& s );
  	 	
  	 	 
     	 
};





class fibonacci :public seq 
{
	
     	public:
		fibonacci(int );
		~fibonacci();
        void gen_elems(int i)
 	{
	 	 int aux,aux2,soma,contador,tam;
	    tam=length();
	    for(contador=tam;contador<=i;contador++)
		 {	 	
        aux=contador-1;
	 	aux2=contador-2;
	 	soma=sequencia[aux]+sequencia[aux2];
	 	sequencia.push_back(soma);
	 	
		 }
		 
    }
};


class lucas:public seq 
{ 

	public:
	lucas(int );
	~lucas();
	void gen_elems(int i)
 	{
	 	 int aux,aux2,soma,contador,tam;
	    tam=length();
	    for(contador=tam;contador<=i;contador++)
		 {	 	
        aux=(contador-1);
	 	aux2=contador-2;
	 	soma=sequencia[aux]+sequencia[aux2];
	 	sequencia.push_back(soma);
		 }
		 
    }
     	
};


class Pell: public seq  
 {
 
 	public:
 	Pell(int );
 	~Pell();
 	 void gen_elems(int i)
 	{
	 	 int aux,aux2,soma,contador,tam;
	    tam=length();
	    for(contador=tam;contador<=i;contador++)
		 {	 	
        aux=(contador-1);
	 	aux2=contador-2;
	 	soma=(2*sequencia[aux])+sequencia[aux2];
	 	sequencia.push_back(soma);
		 }
		 
    }
 };
 

 class Triangular:public seq 
{
	
	public:
	Triangular(int);
	~Triangular();
	void gen_elems(int i)
 	{
	 	 int aux,aux2,soma,contador,tam;
	    tam=length();
	    for(contador=tam;contador<=i;contador++)
		 {	 	
        aux=(contador-1);
	 	aux2=contador;
	 	soma=sequencia[aux]+aux2;
	 	sequencia.push_back(soma);
		 }
		 
    }
};



 class Quadrados:public seq  
 {
 	
 	public:
 	Quadrados(int);
 	~Quadrados();
 		void gen_elems(int i)
 	{
	 	 int aux,soma,contador,tam;
	    tam=length();
	    for(contador=tam;contador<=i;contador++)
		 {	 
		 		
        aux=contador;
        
	 	soma=aux*aux;
	 	
	 	sequencia.push_back(soma);
		 }
		 
		 
    }
 };
 

 class Pentagonal:public seq  
{
	
	public:
	Pentagonal(int );
	~Pentagonal();
		void gen_elems(int i)
 	{
	 	 int aux,aux2,soma,contador,tam;
	    tam=length();
	    for(contador=tam;contador<=i;contador++)
		 {	 
		 	cout<<"\n contador: "<<contador;	
        aux=contador-1;
    
	 	aux2=(3*contador)+2;
	 	
	 	soma=(aux*aux2);
	 	soma =soma/2;
	 	soma=soma+1;
	 
	 	sequencia.push_back(soma);
		 }
		 
    }
};




// Implementação
void seq::imprimep(seq *b)
{
	int i,tama;
	tama=b->length();
     for(i=0;i<tama;i++)
	{
		cout<<SEQ[i]<<" ";
	}
}
void seq::colocat(seq *a)
{
	int i,ta;
	ta=a->length();
	for(i=0;i<ta;i++)
	{
		SEQ.push_back(a);
	}
	
}
void seq:: menu(seq *p)
{
	int size,x,i,j;
	int op2;
	    cout<<"\n Digite a opcao desejada(ou 0 para sair):"<<endl;
	 	cout<<"(1) Gerar o i-enesimo termo da sequencia:"<<endl;
	 	cout<<"(2) Tamanho da sequencia"<<endl;
	 	cout<<"(3)Escrever todos os elementos gerados em os"<<endl;
	 	cout<<"(4)Imprimir i-enesimo termo"<<endl;
	 	cout<<"(5)Imprimir a sequencia de i até j"<<endl;
	 	cout<<"(6)Imprimir vetor de objetos"<<endl;
	 	cin>>op2;
	 	
	 	
	 	do{
			 
			 	switch (op2) {
            case (1):
            	
                  p->elemento();
				  	
			  break;
             case (2):
             
              size=p->length();
              
              cout<<"O tamanho da sequencia e:"<<size<<endl;
              cout<<endl;
			  break;
             case (3):
             
             p->print(cout);
			 break;
		    case(4):
		    	
		    	cout<<"Digite o termo que deseja imprimir: "<< endl;
		    	cin>>x;
		    	
		    	p->imprime_termo(x);
   	        break;
   	        
   	        case(5):
   	        	
   	        	cout<<"Digite o inicio da impressao:"<<endl;
   	        	cin>>i;
   	        	cout<<"Digite o fim da impressao"<<endl;
   	        	cin>>j;
   	        	p->imprime1(i,j);
   	        	break;
   	        case(6):
   	        	p->colocat(p);
   	        	p->imprimep(p);
			    
			    }  
        
        cout<<"\n Digite a opcao desejada(ou 0 para sair):"<<endl;
	 	cout<<"(1) Gerar o i-enesimo termo da sequencia:"<<endl;
	 	cout<<"(2) Tamanho da sequencia"<<endl;
	 	cout<<"(3)Escrever todos os elementos gerados em os"<<endl;
	 	cout<<"(4)Imprimir i-enesimo termo"<<endl;
	 	cout<<"(5)Imprimir a sequencia de i até j"<<endl;
	 	cout<<"(6)Imprimir vetor de objetos"<<endl;
	 	cin>>op2;
	 	system("clear||cls");
			 
		 }while(op2!=0);
}
void seq::imprime1(int ii ,int ifi)
{
		int ct,tamanho;
		tamanho=length();
		if(ifi!=tamanho)
		{
			gen_elems(ifi);
		}
		
			for(ct=ii;ct<ifi;ct++)
			{
		   cout<<sequencia[ct]<<" ";
	        }	
		

}

unsigned long int seq::elem(int i)
{
	return sequencia[i];
}
int seq::length()
{
	return sequencia.size();
} 
int seq::elemento()
{ 
    int elementos;
	cout<<"Digite o numero de elementos que deseja gerar:"<<endl;
	cin>>elementos;
	if(elementos==length() )
	{
		cout<< "Lista ja gerada!"<<endl;
	}
	else{
		gen_elems(elementos);
	}
	
}

void seq ::print(ostream &os)
{
	int i,t;
	t=length();
	for(i=0;i<t;i++)
	{
      os << sequencia[i]<<" " ;
	}

}
/*void seq::operator<<( ostream &o, seq& s )
{
	o <<s.print();
	
}*/

void seq::imprime_termo(int term)
{
		int tama=length();
		if(term!=tama)
		{
			gen_elems(term);
		}
		
		cout<<"O "<<term <<"da sequencia e:"<<sequencia[term]<<endl;
		
}

fibonacci::fibonacci(int n)
 {
 	int tamanho;
 	tamanho=length();
  sequencia.push_back(0);
  sequencia.push_back(1);
  sequencia.push_back(1);
  
  if(n<tamanho)
  {
  	gen_elems(n);
  }
	 
 }
 fibonacci::~fibonacci()
 {
 	
 }
 
 lucas::lucas(int l)
 {
   int TAMANHO;
   TAMANHO=length();
  sequencia.push_back(0);
  sequencia.push_back(1);
  sequencia.push_back(3);
  
  if(l<TAMANHO)
  {
  	gen_elems(l);
  }
 }
 
 lucas::~lucas(){}
 
 Pell::Pell(int  P)
 {
 	int TAMAN;
   TAMAN=length();
  sequencia.push_back(0);
  sequencia.push_back(1);
  sequencia.push_back(2);
  
  if(P<TAMAN)
  {
  	gen_elems(P);
  	
  }
 }
 
 Pell::~Pell(){};
 
 
 Triangular::Triangular(int T)
 {
 	int Tamanho;
   Tamanho=length();
  sequencia.push_back(0);
  sequencia.push_back(1);
  sequencia.push_back(3);
  
  if(T <Tamanho)
  {
  	gen_elems(T);
  }
 }
  Triangular:: ~Triangular(){}
 
 
Quadrados::Quadrados(int Q)
{
   int TamanhO;
   TamanhO=length();
  sequencia.push_back(0);
  sequencia.push_back(1);
  sequencia.push_back(4);
  
  if(Q <TamanhO)
  {
  	gen_elems(Q);
  }
}
Quadrados::~Quadrados(){}


Pentagonal::Pentagonal(int p)
{
	int TAmanhO;
   TAmanhO=length();
  sequencia.push_back(0);
  sequencia.push_back(1);
  sequencia.push_back(5);
  
  if(p <TAmanhO)
  {
  	gen_elems(p);
  }
}

Pentagonal::~Pentagonal(){}

#endif 
                 
                 
                //main
                 
                 #include <iostream>
#include <vector>
#include <stdlib.h>
#include "seq.h"

using namespace std;

 int main()
 {
   seq *fib= new fibonacci(3);
   seq *luc= new lucas(3);
   seq *pe= new Pell(3);
   seq *t= new Triangular(3);
    seq *q= new Quadrados(3);
     seq *p= new Pentagonal(3);
 	int op;
 	
	 cout<<"\nDigite a sequencia desejada(ou 0 para sair):"<<endl;
 	cout<<"(1)Fibonacci "<<endl;
	 cout<<"(2)Lucas"<<endl;
	 cout<<"(3)Pell"<<endl;
	 cout<<"(4)Triangular"<<endl;
	 cout<<"(5)Quadrados"<<endl;
	 cout <<"(6)Pentagonal "<<endl;
	 cin>>op;
 	system("clear||cls");
 	while(op!=0)
	 {
	 	
      if(op==1)
	  {
	  	fib->menu(fib);
	  }
	  if(op==2)
	  {
	  	luc->menu(luc);
	  }
	  if (op==3)
	  {
	  	pe->menu(pe);
	  }
	   if (op==4)
	  {
	  	t->menu(t);
	  }
	   if (op==5)
	  {
	  	q->menu(q);
	  }
	   if (op==6)
	  {
	  	p->menu(p);
	  }
	
      cout<<"\nDigite a sequencia desejada(ou 0 para sair):"<<endl;
 	  cout<<"(1)Fibonacci "<<endl;
	  cout<<"(2)Lucas"<<endl;
	  cout<<"(3)Pell"<<endl;
	  cout<<"(4)Triangular"<<endl;
	  cout<<"(5)Quadrados"<<endl;
	  cout <<"(6)Pentagonal "<<endl;
	  cin>>op;
 	  system("clear||cls");
	 }	
	 
}
                 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Amanda Kellen Olá. Apenas para exemplo de criar um vetor de objetor usando a classe vector, criei um pequeno código para q possa entender a lógica

Nesse exemplo estou passando todo o código em um só arquivo, mas é preferível trabalhar com arquivos separados, que é o que costumo fazer

Segue o código:
 

#include <iostream>
#include <string>
#include <vector>
using namespace std;

class Jogador {

public:
    ~Jogador();
    Jogador(string nome, int idade);
    string getNome();
    int getIdade();

private:
    string nome;
    int idade;
};

Jogador::~Jogador() {}

Jogador::Jogador(string nome, int idade) {
    this->nome = nome;
    this->idade = idade;
}

string Jogador::getNome() {
    return nome;
}

int Jogador::getIdade() {
    return idade;
}

int main(void) {

    vector<Jogador *> jogadores; // vetor de objetos do tipo Jogador

    jogadores.push_back(new Jogador("Gustavo", 34)); // insere o 1º objeto no vetor
    jogadores.push_back(new Jogador("Jessi", 21)); // 2º objeto

    cout << endl;

    cout << "Nome do jogador 1: " << jogadores.at(0)->getNome()
         << endl << "Idade: " << jogadores.at(0)->getIdade() << endl;
    cout << "Nome do jogador 2: " << jogadores.at(1)->getNome()
         << endl << "Idade: " << jogadores.at(1)->getIdade() << endl;

    return 0;
}

Desculpa a demora em responder esse tópico 

Se conseguir entender a lógica que está sendo usada vai saber trabalhar com um vetor de objetos usando a classe vector

 

Qualquer dúvida é só perguntar, ok?

Link para o comentário
Compartilhar em outros sites

@Amanda Kellen Olá. O método at é para acessar determinado índice do vetor, quando se trabalha com a classe vector.

Equivale a fazer isso:

jogadores[0]->getNome()

Daria o mesmo resultado. Mas, como o C++ disponibiliza esse método quando se trabalha com a classe vector, vejo q é muito mais adequado fazer uso desse recurso e de todos os recursos que a linguagem disponibiliza. Dessa forma, poderemos tirar melhor proveito de determinada linguagem de programação, seja ela qual for 😉

Veja um exemplo prático disso q estou falando para imprimir os objetos que inseri no vetor do código acima

Sem fazer uso dos recursos do C++:

for (int i = 0; i < 2; i++) {
    cout << "Nome do jogador " << (i + 1) << ": " << jogadores[i]->getNome()
         << endl << "Idade: " << jogadores[i]->getIdade() << endl;
}

Fazendo uso dos recursos do C++:

for (int i = 0; i < jogadores.size(); i++) {
    cout << "Nome do jogador " << (i + 1) << ": " << jogadores.at(i)->getNome()
         << endl << "Idade: " << jogadores.at(i)->getIdade() << endl;
}

Percebe a diferença? 

Em um código como esse pode parecer insignificante isso, mas, quando você estiver trabalhando com projetos maiores, vai perceber claramente as vantagens de fazer uso de todos os recursos possíveis q uma linguagem de programação disponibiliza

 

@Amanda Kellen Outro ponto que é importante frisar: Quando a gente cria um novo objeto em C++ usando para isso o operador new, esse objeto fica alocado na memória, mais especificamente na região da memória chamada de Heap. E, em C++, é de responsabilidade do programador liberar essa memória q foi alocada, depois do uso dos objetos criados

O comando que é usado no C++ para isso é o delete

No caso do exemplo que passei acima, a forma para liberar a memória q foi alocada seria essa

for (int i = 0; i < jogadores.size(); i++) {
    delete jogadores.at(i);
}

Já, indo para o código que você criou, você (por exemplo) criou um novo objeto dessa forma:

seq *fib= new fibonacci(3);

Pegando esse exemplo, a maneira de liberar a memória q foi alocada para esse objeto seria essa:

delete fib;

É preciso fazer isso com todos os objetos que você criou ou venha a criar em seu código

 

Qualquer dúvida é só perguntar 🙂

 

Psiu: Quanto a sobrecarga de operadores vou ficar te devendo, não estudei sobre isso ainda

Negócio é esperar q algum colega aqui do fórum dê uma mãozinha

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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!