Peixoto 0 Denunciar post Postado Abril 28, 2012 :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
GBecker 51 Denunciar post Postado Abril 30, 2012 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
Peixoto 0 Denunciar post Postado Abril 30, 2012 :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
GBecker 51 Denunciar post Postado Abril 30, 2012 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
Peixoto 0 Denunciar post Postado Abril 30, 2012 :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 scopeSobrecarga_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
GBecker 51 Denunciar post Postado Maio 1, 2012 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
Peixoto 0 Denunciar post Postado Maio 2, 2012 :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 Saida7.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
GBecker 51 Denunciar post Postado Maio 2, 2012 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
Peixoto 0 Denunciar post Postado Maio 3, 2012 :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
GBecker 51 Denunciar post Postado Maio 3, 2012 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
Peixoto 0 Denunciar post Postado Maio 4, 2012 :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
GBecker 51 Denunciar post Postado Maio 5, 2012 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
Peixoto 0 Denunciar post Postado Maio 5, 2012 :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
GBecker 51 Denunciar post Postado Maio 10, 2012 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
Peixoto 0 Denunciar post Postado Maio 10, 2012 :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
GBecker 51 Denunciar post Postado Maio 10, 2012 :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
Renato Utsch 24 Denunciar post Postado Maio 10, 2012 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
GBecker 51 Denunciar post Postado Maio 10, 2012 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
Peixoto 0 Denunciar post Postado Maio 10, 2012 :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
GBecker 51 Denunciar post Postado Maio 10, 2012 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