Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Peixoto

Mostrar saida de função sobrecarregada de operador

Recommended Posts

:upset:

 

Como mostrar o resultado de uma função de sobrecarga de operador. a++ e a-- estão mostrando o mesmo valor Veja o código:

 

class Sobrecarga
{
private:
double x,y,saida_tela;  
public:
//Construtor
Sobrecarga(double valor);
//Operadores unários
Sobrecarga& operator++(int);
Sobrecarga& operator++(); 
Sobrecarga& operator--(int);
Sobrecarga& operator--();
//Operador binnario 
Sobrecarga operator+(Sobrecarga s1);
//função amiga para imprimir o valor de "a"
 friend ostream& operator<<(ostream& os, Sobrecarga obj);
};
Sobrecarga::Sobrecarga(double valor){saida_tela=valor;}
Sobrecarga& Sobrecarga::operator++()
{
this->x++;
this->y++;
return *this;
}
Sobrecarga& Sobrecarga::operator--()
{
this->x--;
this->y--;
return *this;
}
ostream &operator<<(ostream& os, Sobrecarga obj)
{
   os << obj.saida_tela;
   return os;
}
int main()
{
   cout << "sobrecarga de operadores " << endl;
   Sobrecarga a(6.0);
    cout << a++ << endl;
    cout << a-- << endl;
   return 0;
}

 

Saída

sobrecarga de operadores

6

6

Pressione qualquer tecla para continuar. . .

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Peixoto,

 

Só esta mostrando o "6.0", por que este é o valor que você inicializou o atributo saida_tela.

 

Sobrecarga& Sobrecarga::operator++()
{
       this->x++;
       this->y++;
return *this;
}
Sobrecarga& Sobrecarga::operator--()
{
       this->x--;
       this->y--;
return *this;
}
ostream &operator<<(ostream& os, Sobrecarga obj)
{
   os << obj.saida_tela;
   return os;
}

 

Perceba que nos métodos de sobrecarga dos operadores ++ e --, você só incrementa os atributos x e y. E no método de sobrecarga do operador <<, você passa o atributo saida_tela.

 

Você tem saída sempre de "6.0" porque você desenha um atributo que não foi incrementado o decrementado com os operadores sobrecarregados.

 

Espero ter ajudado, FLW!! :grin:

Compartilhar este post


Link para o post
Compartilhar em outros sites

:upset:

 

Ok.

 

Tive que sobrecarregar << pois se não fizesse desta forma não conseguiria mostrar o valor de a; sem a sobrecarga de << o programa nem compila. Agora que você falou vi que tem lógica. Tem alguma alternativa para contornar o problema ? não estou visualizando nada no momento.

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faça as operações de incremento e decremento também na variável saida_tela na sobrecarga dos operadores ++ e --. Ou, na sobrecarga do operador <<, passe os atributos x e y.

 

Assim você poderá vê-los incrementados ou decrementados.

 

Espero ter ajudado,FLW! :grin:

Compartilhar este post


Link para o post
Compartilhar em outros sites

:rolleyes:

Como fazer isso sem descaracterizar o aspecto geral da função:

ostream &operator<<(ostream& os, Sobrecarga obj)
{
   os << obj.saida_tela;
   return os;
}

 

Ela teria que atender a todas as funções sobrecarregadas de operadores da classe, ou seja:

 

//Operadores unários
Sobrecarga& operator++(int);
Sobrecarga& operator++(); 
Sobrecarga& operator--(int);
Sobrecarga& operator--();
//Operador binnario 
Sobrecarga operator+(Sobrecarga s1);

 

Eu achava que escrevendo:

 

cout << a++ << endl;
cout << a-- << endl;

 

estaria chamando as funções sobrecarregadas da classe Sobrecarga.

Poderia alterar o código para eu entender ?

 

Tentei mudar o corpo da função para:

 

ostream &operator<<(ostream& os, Sobrecarga obj)
{

 os << obj.saida_tela=x;
 os << obj.saida_tela=y;
return os;
}

 

Mas deu erro.

 

Sobrecarga_operador.cpp:65:26: error: 'x' was not declared in this scope

Sobrecarga_operador.cpp:66:26: error: 'y' was not declared in this scope

 

 

 

e mostrar:

 

int main()
{
   cout << "sobrecarga de operadores " << endl;

    Sobrecarga a(6.0);

    cout << a << endl;
    return 0;

 

Como fazer ?

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Peixoto,

 

Para ver o incremento faça isto:

 

Sobrecarga& Sobrecarga::operator++()
{
       this->x++;
       this->y++;
       this->saida_tela++;
return *this;
}
Sobrecarga& Sobrecarga::operator--()
{
       this->x--;
       this->y--;
       this->saida_tela--;
return *this;
}
ostream &operator<<(ostream& os, Sobrecarga obj)
{
   os << obj.x;
   os << obj.y;
   os << obj.saida_tela;
   return os;
}

 

Espero ter ajudado, FLW! :grin:

Compartilhar este post


Link para o post
Compartilhar em outros sites

:grin:

Ok. O problema de compilação foi resolvido, mas o valor mostrado não foi o esperado. O que está faltando ? veja a saída do programa.

 

 

Sobrecarga& Sobrecarga::operator++()
{
       this->x++;
       this->y++;
       this->saida_tela++;
return *this;
}
Sobrecarga& Sobrecarga::operator--()
{
       this->x--;
       this->y--;
       this->saida_tela--;
return *this;
}
ostream &operator<<(ostream& os, Sobrecarga obj)
{
   os << obj.x;
   os << obj.y;
   os << obj.saida_tela;
   return os;
}

int main()
{
   cout << "Saida " << endl;
     Sobrecarga a(6.0);
     cout << a << endl;
    return 0;
}

 

Saída no vídeo

 

Saida

7.14243e+2681.79179e-3076

Pressione qualquer tecla para continuar. . .

 

Não deveria mostrar valores decimais?

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Peixoto,

 

Deve estar ocorrendo isto pois os atributos x e y do objeto não esta inicializados, ou seja, estão armazenando sujeira.

 

Faça isto lá no construtor:

 

Sobrecarga::Sobrecarga(double valor){
     this->saida_tela = valor;
     this->x = valor;
     this->y = valor;
}

 

Espero ter ajudado, FLW! :grin:

Compartilhar este post


Link para o post
Compartilhar em outros sites

:upset:

 

Entendi que x e y estão armazenando lixo, mas acho que não entendi bem a idéia da inicialização.

Você diz para em fazer saída_tela=valor, mas analisando o trecho de código abaixo o construtor não deveria fazer isso , pois o construtor foi inicializado. Veja o trecho de código. O que não estou vendo?

 

class Sobrecarga
{
private:
	double x,y,saida_tela;  
public:
//Construtor
Sobrecarga(double valor);
//Operadores unários
Sobrecarga& operator++(int);
Sobrecarga& operator++(); 
Sobrecarga& operator--(int);
Sobrecarga& operator--();
//Operador binnario 
Sobrecarga operator+(Sobrecarga s1);
//função amiga para imprimir o valor de "a"
 friend ostream& operator<<(ostream& os, Sobrecarga obj);
};
Sobrecarga::Sobrecarga(double valor){saida_tela=valor;}
Sobrecarga& Sobrecarga::operator++()
{
this->x++;
this->y++;
this->saida_tela++;
return *this;
}
int main()
{
   cout << "Saida " << endl;

    Sobrecarga a(6.0);

    cout << a << endl;
    return 0;
}

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Peixoto,

 

É só você inicializar todos os atributos do objeto no construtor da classe.

 

Assim:

 

#include <iostream>
#include <cstdlib>

using namespace std;

class Sobrecarga
{
       private:
               double x,y,saida_tela;  
       public:
       //Construtor
       Sobrecarga(double valor);
       //Operadores unários
       Sobrecarga& operator++(int);
       Sobrecarga& operator++(); 
       //Sobrecarga& operator--(int);
       //Sobrecarga& operator--();
       //Operador binnario 
       //Sobrecarga operator+(Sobrecarga s1);
       //função amiga para imprimir o valor de "a"
        friend ostream& operator<<(ostream& os, Sobrecarga obj);
};
Sobrecarga::Sobrecarga(double valor){
       saida_tela=valor;
       x = valor;
       y = valor;
}
Sobrecarga& Sobrecarga::operator++(int)
{
       this->x++;
       this->y++;
       this->saida_tela++;
       return *this;
}

ostream &operator<<(ostream& os, Sobrecarga obj)
{
   os << obj.x;
   os << obj.y;
   os << obj.saida_tela;
   return os;
}

int main()
{
   cout << "Saida " << endl;

   Sobrecarga a(6.0);

   cout << a << endl;
   a++;
   cout << a << endl;

   system("PAUSE");
   return 0;
}

 

Este é o mesmo código que você postou. Só inicializei os atributos no construtor:

 

Sobrecarga::Sobrecarga(double valor){
       saida_tela=valor;
       x = valor;
       y = valor;
}

 

Compilei e executei utilizando o DEVC++ portable, e na saída obtive o numero da besta( =P ) "666" e depois de fazer o incremento obtive um "777".

 

Compila este código que vai rodar.

 

Espero ter ajudado, FLW! :grin:

Compartilhar este post


Link para o post
Compartilhar em outros sites

:grin:

 

Finalmente o programa parece estar começando a funcionar com queria. Eu comecei a estudar o tema pelo Herbert Schildt, mas tirei a base do programa de um pdf que baixei da internt, e venho tentando burilar.

Agora que a coisa está “mais redonda”, poderei questionar melhor as características de sobrecarga de operadores.

Mudei o valor da inicialização, nada de numero de Besta em meu programa, rs...rs.. mudei o valor para 4.

 

1)Entendi que ao fazer:

 

ostream &operator<<(ostream& os, Sobrecarga obj)
{
  os << obj.x;
  os << obj.y;
  os << obj.saida_tela;
   return os;
}

int main()
{
    Sobrecarga a(4.0);
    cout << "Saida original de \"a\"." << endl;
    cout << a << endl;
    cout << "Saidal de \"a++\"." << endl;
    a++;     
    cout << a << endl;
    cout << "Saidal de \"a--\"." << endl;
    a--;
    cout << a << endl;
    return 0;
}  

 

Tela Saida

 

Saida original de "a".

444

Saidal de "a++".

554

Saidal de "a--".

444

Pressione qualquer tecla para continuar. . .

 

Se eu mudar a função travando x e y, ou seja:

 

ostream &operator<<(ostream& os, Sobrecarga obj)
{
// os << obj.x;
//   os << obj.y;
 os << obj.saida_tela;
   return os;
}

 

A saída do programa muda para:

 

Saida original de "a".

4

Saidal de "a++".

4

Saidal de "a--".

4

Pressione qualquer tecla para continuar. . .

 

Gostaria de entender por quê preciso de x e y nesta função. A meu ver a saída correta ou desejada seria:

 

Saida original de "a".

4

Saidal de "a++".

5

Saidal de "a--".

4

 

Já que estou entrando com 4.0. Tem como corrigir isso?

 

2)Na rotina:

 

Sobrecarga& Sobrecarga::operator++()
{
this->x++;
this->y++;
this->saida_tela++;
return *this;
}

Teve que incluir a linha:

 

this->saida_tela++;

 

Ao invés de:

 

this->saida_tela;

 

não é x e y que estão fazendo o incremento na função ? qual o motivo de saida_tela++?

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Peixoto,

 

Se eu mudar a função travando x e y, ou seja:

ostream &operator<<(ostream& os, Sobrecarga obj)
{
// os << obj.x;
//   os << obj.y;
 os << obj.saida_tela;
   return os;
}

 

A saída do programa muda para:

 

Saida original de "a".

4

Saidal de "a++".

4

Saidal de "a--".

4

Pressione qualquer tecla para continuar. . .

 

Gostaria de entender por quê preciso de x e y nesta função. A meu ver a saída correta ou desejada seria:

 

Saida original de "a".

4

Saidal de "a++".

5

Saidal de "a--".

4

 

Já que estou entrando com 4.0. Tem como corrigir isso?

 

Você não precisa de x e y.

Só os coloquei ali para você ver resultado na saída.

 

2)Na rotina:

 

Sobrecarga& Sobrecarga::operator++()

{

this->x++;

this->y++;

this->saida_tela++;

return *this;

}

 

Teve que incluir a linha:

 

this->saida_tela++;

 

 

Ao invés de:

 

this->saida_tela;

 

 

não é x e y que estão fazendo o incremento na função ? qual o motivo de saida_tela++?

 

Veja bem, saida_tela é um atributo do objeto assim como x e y.

Fazendo saida_tela++,você estará incrementado este atributo assim como fez nos outros(x e y).

Se fizer apenas this->saida_tela, não haverá alteração alguma no valor do atributo.

 

Segue um link para estudos:

http://pt.wikibooks.org/wiki/Programar_em_C%2B%2B/Sobrecarga_de_operadores

 

Espero ter ajudado, FLW! :grin:

Compartilhar este post


Link para o post
Compartilhar em outros sites

:upset:

 

Vi a página que você indicou, o exemplo é similar ao que vi num pdf(pontos no plaxo x e y). Acho melhor continuar com meu exemplo, acho que está mais fácil.

 

Considere a classe:

 

 

 

class Sobrecarga
{
private:
	double x,y,saida_tela;  

public:
//Construtor
Sobrecarga(double valor);
//Operadores unários
Sobrecarga& operator++(int);
Sobrecarga& operator++(); 
Sobrecarga& operator--(int);
Sobrecarga& operator--();
//Operador binnario 
Sobrecarga operator+(Sobrecarga s1);
//função amiga para imprimir o valor de "a"
       friend ostream& operator<<(ostream& os, Sobrecarga obj);
};

3- Qual a diferença entre:

 

Sobrecarga& operator++(int);

 

e

 

Sobrecarga& operator++();

 

 

int main()
{

    Sobrecarga a(4.0);
    cout << "Saidal de \"a++\"." << endl;
    a++;     
    cout << a << endl;
return(0);
}

 

Ao fazer a++ imagino que esteja chamando a função:

 

Sobrecarga& operator++();

 

Poderia comentar?

 

 

4- Considere a função que sobrecarrega <<

 

ostream &operator<<(ostream& os, Sobrecarga obj)
{
 //Corpo
   return os;
}

 

Sei que posso sobrecarregar << desta forma

 

 

ostream &operator<<(ostream &out, Mostra obj)
{
  //Corpo 
}

 

Usando out. Qual a diferença dos dois tipos de sobrecarga <<?

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Peixoto,

 

3- Qual a diferença entre:

 

Sobrecarga& operator++(int);

 

 

e

 

Sobrecarga& operator++();

 

 

 

Na verdade quase nenhuma. Eu me arriscaria a dizer que desta forma esta errado.

Pois, quando se sobrecarrega um operador. Estamos na verdade "ensinando" o compilador a como realizar a operação daquele operador para o tipo de dado definido na classe.

Logo, o que ele deve receber como parâmetro é um objeto do tipo da classe.

 

Por exemplo, precisei utilizar este código na empresa para um teste:

#ifndef		TTESTE
#define		TTESTE

class TTeste{
public:
int iNumero;
std::string strString;

TTeste() {};
TTeste(int iNum,std::string strParam) {
	this->iNumero = iNum;
	this->strString = strParam;
}
TTeste operator=(TTeste* obj) {
	this->iNumero = obj->iNumero;
	this->strString = obj->strString;
	return *this;
}
};

#endif		//TTESTE

 

Supomos em main:

int main(void) {
TTeste obj(5,"cachorro");
TTeste obj1(10,"gato");

obj = obj1;

return 0;
}

 

Perceba que nesta linha:

obj = obj1;

Utilizo a sobrecarga do operador =. O objeto que vai chamar a sobrecarga é o objeto a esquerda do operador =. E o objeto da da direita é o recebido como para parâmetro.

TTeste operator=(TTeste* obj)

 

Foi desta forma que aprendi. =P

 

4- Considere a função que sobrecarrega <<

 

ostream &operator<<(ostream& os, Sobrecarga obj)

{

//Corpo

return os;

}

 

 

Sei que posso sobrecarregar << desta forma

 

 

ostream &operator<<(ostream &out, Mostra obj)

{

//Corpo

}

 

 

Usando out. Qual a diferença dos dois tipos de sobrecarga <<?

 

Neste caso acho que não há diferença. Tanto os quanto out, são objetos do tipo ostream.

 

Acho que é isso. Desculpe a demora para responder andei meio enrolado aqui!

 

Espero ter ajudado, FLW! :grin:

Compartilhar este post


Link para o post
Compartilhar em outros sites

:upset:

OK.

 

5- Eu imaginei que fosse algo do tipo, ou erro ou redundância de código;entretanto não tinha base para fazer qualquer afirmação. Pensei em eliminar eliminar as rotinas de sobrecarga da classe:

 

Sobrecarga& operator++(int);

 

E

 

Sobrecarga& operator--(int);

 

Mas quando travei as rotinas:

 

/*Sobrecarga& Sobrecarga::operator++(int)
{
this->x++;
this->y++;
return *this;
} 

Sobrecarga& Sobrecarga::operator--(int)
{
this->x--;
this->y--;
return *this;
}   
*/

 

Recebi as seguintes mensagens de erro:

 

Sobrecarga_operador.cpp:86:7: error: no 'operator++(int)' declared for postfix '++' [-fpermissive]

Sobrecarga_operador.cpp:89:7: error: no 'operator--(int)' declared for postfix '--' [-fpermissive]

 

Seriam

 

Sobrecarga& Sobrecarga::operator++()
{
this->x++;
this->y++;
this->saida_tela++;
return *this;
}
e
Sobrecarga& Sobrecarga::operator--()
{
this->x--;
this->y--;
this->saida_tela--;
return *this;
}

 

Formas pré-fixadas da função ? Como se são iguais? Como pode dar problema ao travar ? se eu destravar o problema some.

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

:upset:

 

Como mostrar o resultado de uma função de sobrecarga de operador. a++ e a-- estão mostrando o mesmo valor Veja o código:

 

class Sobrecarga
{
private:
double x,y,saida_tela;  
public:
//Construtor
Sobrecarga(double valor);
//Operadores unários
Sobrecarga& operator++(int);
Sobrecarga& operator++(); 
Sobrecarga& operator--(int);
Sobrecarga& operator--();
//Operador binnario 
Sobrecarga operator+(Sobrecarga s1);
//função amiga para imprimir o valor de "a"
 friend ostream& operator<<(ostream& os, Sobrecarga obj);
};
Sobrecarga::Sobrecarga(double valor){saida_tela=valor;}
Sobrecarga& Sobrecarga::operator++()
{
this->x++;
this->y++;
return *this;
}
Sobrecarga& Sobrecarga::operator--()
{
this->x--;
this->y--;
return *this;
}
ostream &operator<<(ostream& os, Sobrecarga obj)
{
   os << obj.saida_tela;
   return os;
}
int main()
{
   cout << "sobrecarga de operadores " << endl;
   Sobrecarga a(6.0);
    cout << a++ << endl;
    cout << a-- << endl;
   return 0;
}

 

Saída

 

 

Obrigado

 

Peixoto,

 

Elas não são iguais. Uma recebe como parâmetro um valor int e a outra não recebe nada.

 

Ja tentou debuggar este código?

Talvez executando ele passo-a-passo e vendo os atributos do objeto e o que a sobrecarga recebe como parâmetro fique mais fácil de compreender.

 

Não sei qual IDE você usa, mas recomendo o code::blocks onde o debugger funciona direitinho.

Com DEVC, não consegui debugar. =P

 

Espero ter ajudado, FLW! :grin:

Compartilhar este post


Link para o post
Compartilhar em outros sites
Não sei qual IDE você usa, mas recomendo o code::blocks onde o debugger funciona direitinho.

Com DEVC, não consegui debugar. =P

 

Não sei porque ainda usam esse DevC++, não faz o menor sentido. Ele foi abandonado na época que ainda usavam Windows 95, como que tem gente que usa ele até hoje?

 

O Code::Blocks é bem superior, e ainda é portável...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei porque ainda usam esse DevC++, não faz o menor sentido. Ele foi abandonado na época que ainda usavam Windows 95, como que tem gente que usa ele até hoje?

 

O Code::Blocks é bem superior, e ainda é portável...

 

Renato,

 

Utilizo a versão portable que carrego no pendrive, assim não preciso instalar uma IDE em todo PC que utilizo.

 

E assim mesmo só utilizo para testes simples.

 

Sds, Gabriel Becker.

Compartilhar este post


Link para o post
Compartilhar em outros sites

:wacko:

 

Eu a IDE Geany 0.21. Eu tive problema com as outras IDEs citadas.

 

O curioso, é que se travo na classe

 

Sobrecarga& operator++(int);
       Sobrecarga& operator--(int);

ou

Sobrecarga& operator++(); 
     Sobrecarga& operator--(); 

 

Dá os mesmos erros é como se as quatro tivessem que trabalhar juntas. Destravando as quatro os erros de compilação somem. Quando disse que eram iguais me referia ao corpo das funções. Exemplo: o corpo de

Sobrecarga& operator++(int) é igual a Sobrecarga& operator++().

 

6- Destravei as funções eliminando erros para mostrar outro ponto:

 

Veja esta função que sobrecarrega o operador +

 

Sobrecarga Sobrecarga::operator+(Sobrecarga s1)
{
Sobrecarga temp(0.0);
temp.x= x + s1.x;
temp.y= y + s1.y;
temp.saida_tela+;
return temp;
}	
int main()
{
    cout << "Saidal de \"a+\"." << endl;
   // a+;
    //cout << a << endl;
    return 0;
}

 

Recebo o erro:

 

Sobrecarga_operador.cpp:69:18: error: expected primary-expression before ';' token

 

Não entendo, não segui a lógica das outras funções? O erro cai na linha:

 

temp.saida_tela+;

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Peixoto,

 

Veja a definição da classe:

class Sobrecarga
{
       private:
       double x,y,saida_tela;  
       public:
       //Construtor
       Sobrecarga(double valor);
       //Operadores unários
       Sobrecarga& operator++(int);
       Sobrecarga& operator++(); 
       Sobrecarga& operator--(int);
       Sobrecarga& operator--();
       //Operador binnario 
       Sobrecarga operator+(Sobrecarga s1);
       //função amiga para imprimir o valor de "a"
 friend ostream& operator<<(ostream& os, Sobrecarga obj);
};

 

saida_tela é um atributo do objeto. Você não pode fazer isto temp.saida_tela+;

 

Só uma correção. Não se diz travar e sim comentar código. :thumbsup:

 

Espero ter ajudado, FLW! :grin:

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.