 |
Ver Mensagens sem resposta | Ver Tópicos Activos
| [ +/- ]
[ Data/Hora: 19 Mai 2013, 20:39 ]
|
|
| Autor |
Mensagem |
|
CPeixoto
|
Assunto da Mensagem: Erro de compilação ao sobrecarregar operador + Enviado: 21 Abr 2012, 17:13 |
|
| Membro Ativo |
 |
Registado: 21 Abr 2012, 16:43 Mensagens: 158
|
Vejam o erro de compilação do programa. Estou tentando sobrecarregar o operador + Dizem que o erro está na declaração da variável temp, pois teria sido declarada como local. Eu então declarei com membro de classe. Mas não entendi bem esta afirmação. Poderiam corrigir o erro ? Code: #include <iostream>[/color] #include <cstdlib> using namespace std;
class Sobrecarga { private: double x,y,n,temp; public: Sobrecarga(double num); //Operadores unários Sobrecarga& operator++(int); Sobrecarga& operator++(); Sobrecarga& operator--(int); Sobrecarga& operator--(); //Operador binnario Sobrecarga& operator+(Sobrecarga s1); }; Sobrecarga::Sobrecarga(double num) { n = num; } Sobrecarga& Sobrecarga::operator+(Sobrecarga s1) { Sobrecarga temp; temp.x= x + s1.x; temp.y= y + s1.y; return temp; }
int main() { cout << "sobrecarga de operadores " << endl; Sobrecarga a(6.0); a++; return 0; }
As linhas marcadas como erradas pelo compilador são: Code: Sobrecarga::Sobrecarga(double num) E Code: Sobrecarga temp; Erros: Quote: Sobrecarga_operador.cpp:56:13: error: no matching function for call to 'Sobrecarga::Sobrecarga()' Sobrecarga_operador.cpp:56:13: note: candidates are: Sobrecarga_operador.cpp:22:1: note: Sobrecarga::Sobrecarga(double) Sobrecarga_operador.cpp:22:1: note: candidate expects 1 argument, 0 provided Sobrecarga_operador.cpp:6:7: note: Sobrecarga::Sobrecarga(const Sobrecarga&) Sobrecarga_operador.cpp:6:7: note: candidate expects 1 argument, 0 provided Sobrecarga_operador.cpp:56:13: warning: reference to local variable 'temp' returned [enabled by default]
Obrigado
|
|
| Topo |
|
 |
|
fpissarra
|
Assunto da Mensagem: Re: Erro de compilação ao sobrecarregar operador + Enviado: 22 Abr 2012, 09:20 |
|
Registado: 02 Jun 2011, 22:24 Mensagens: 167
|
Você não declarou o construtor default. Assim, ao fazer: Code: Sobrecarga temp; O compilador não sabe que função é essa: Sobrecarga::Sobrecarga(). Experimente declarar: Code: Sobrecarga temp(0.0); E o erro some. Ou então declare o construtor default, por exemplo, como: Code: Sobrecarga::Sobrecarga() : n(0.0) {} []s Fred
|
|
| Topo |
|
 |
|
|
The following user would like to thank fpissarra for his or her post: Visitante |
 |
|
CPeixoto
|
Assunto da Mensagem: Re: Erro de compilação ao sobrecarregar operador + Enviado: 22 Abr 2012, 12:59 |
|
| Membro Ativo |
 |
Registado: 21 Abr 2012, 16:43 Mensagens: 158
|
Testei a duas possibilidades ambas deram erro. Veja: 1- teste Code: #include <iostream> #include <cstdlib> using namespace std;
class Sobrecarga { private: double x,y,n, temp; public: Sobrecarga(double num); //Operadores unários Sobrecarga& operator++(int); Sobrecarga& operator++(); Sobrecarga& operator--(int); Sobrecarga& operator--(); //Operador binnario Sobrecarga& operator+(Sobrecarga s1); }; Sobrecarga::Sobrecarga(double num) { n = num; } Sobrecarga& Sobrecarga::operator+(Sobrecarga s1) { [color=#FF0000]Sobrecarga temp(0.0);[/color] temp.x= x + s1.x; temp.y= y + s1.y; return temp; } int main() { cout << "sobrecarga de operadores " << endl; Sobrecarga a(6.0); a++; return 0; }
Erro: Quote: Sobrecarga_operador.cpp:58:13: warning: reference to local variable 'temp' returned [enabled by default]
2 teste Code: #include <iostream> #include <cstdlib> using namespace std;
class Sobrecarga { private: double x,y,n, temp; public: Sobrecarga(double num); //Operadores unários Sobrecarga& operator++(int); Sobrecarga& operator++(); Sobrecarga& operator--(int); Sobrecarga& operator--(); //Operador binnario Sobrecarga& operator+(Sobrecarga s1); }; [color=#FF0000]Sobrecarga::Sobrecarga() : n(0.0) {}[/color]
Sobrecarga::Sobrecarga(double num) { n = num; } Sobrecarga& Sobrecarga::operator+(Sobrecarga s1) { Sobrecarga temp; temp.x= x + s1.x; temp.y= y + s1.y; return temp; } int main() { cout << "sobrecarga de operadores " << endl; Sobrecarga a(6.0); a++; return 0; }
Alguns erros: Quote: Sobrecarga_operador.cpp:22:1: error: prototype for 'Sobrecarga::Sobrecarga()' does not match any in class 'Sobrecarga'
Sobrecarga_operador.cpp:6:7: error: candidates are: Sobrecarga::Sobrecarga(const Sobrecarga&)
Sobrecarga_operador.cpp:12:2: error: Sobrecarga::Sobrecarga(double)
O que está errado ainda. Seria a dupla declaração de temp ? O que não estou vendo ? Obrigado
|
|
| Topo |
|
 |
|
bcsanches2
|
Assunto da Mensagem: Re: Erro de compilação ao sobrecarregar operador + Enviado: 22 Abr 2012, 23:54 |
|
Registado: 23 Nov 2003, 18:58 Mensagens: 2808 Localização: Brasil
|
Quote: Erro: Quote: Sobrecarga_operador.cpp:58:13: warning: reference to local variable 'temp' returned [enabled by default] Isso não é um erro, apenas um "aviso" do compilador que algo não parece correto, no seu caso, não esta correto mesmo: Code: Sobrecarga& Sobrecarga::operator+(Sobrecarga s1) { Sobrecarga temp; temp.x= x + s1.x; temp.y= y + s1.y; return temp; } Aqui você retorna referência para temp, mas temp é uma variável local, assim que método termina de executar ela "deixa de existir", ou seja, sua referência não é mais valida. Nesse caso, a solução mais simples é tirar a referência: Code: Sobrecarga Sobrecarga::operator+(Sobrecarga s1) { Sobrecarga temp; temp.x= x + s1.x; temp.y= y + s1.y; return temp; } No seu segundo código, o erro é que não existe nenhum construtor na sua classe "Sobrecarga" que receba como parâmetro um número, você possuia apenas o construtor padrão, mas o padrão não recebe parâmetro algum, logo, o compilador não sabe o que fazer com: Code: Sobrecarga a(6.0); T+
_________________ Quer aprender a fazer jogos? http://www.pontov.com.br/ Meus jogos
|
|
| Topo |
|
 |
|
|
The following user would like to thank bcsanches2 for his or her post: Visitante |
 |
|
CPeixoto
|
Assunto da Mensagem: Re: Erro de compilação ao sobrecarregar operador + Enviado: 23 Abr 2012, 08:40 |
|
| Membro Ativo |
 |
Registado: 21 Abr 2012, 16:43 Mensagens: 158
|
O programa compilou, mas tenho algumas perguntas. Veja a nova versão do programa: Code: #include <iostream> #include <cstdlib> using namespace std; class Sobrecarga { private: double x,y,n; public: Sobrecarga(double num); //Operadores unários Sobrecarga& operator++(int); Sobrecarga& operator++(); Sobrecarga& operator--(int); Sobrecarga& operator--(); //Operador binnario Sobrecarga operator+(Sobrecarga s1); }; Sobrecarga::Sobrecarga(double num) { n = num; } Sobrecarga Sobrecarga::operator+(Sobrecarga s1) { Sobrecarga temp(0.0); temp.x= x + s1.x; temp.y= y + s1.y; return temp; } int main() { cout << "sobrecarga de operadores " << endl; Sobrecarga a(6.0); //cout << a++; Esta linha se destravada, congela o processo de compilação return 0; }
1- Não ficou claro o papel da referência no programa, poderia comentar ? sempre vejo referência com alias ou apelido para outra variável. Schhildt e Deitel não abordam uso de referência em função com clareza. 2- Como pode ser visto no comentário acima, não consigo mostrar o resultado de a++ com cout por quê? Obrigado
|
|
| Topo |
|
 |
|
bcsanches2
|
Assunto da Mensagem: Re: Erro de compilação ao sobrecarregar operador + Enviado: 23 Abr 2012, 09:28 |
|
Registado: 23 Nov 2003, 18:58 Mensagens: 2808 Localização: Brasil
|
Quote: Não ficou claro o papel da referência no programa, poderia comentar ? Você entende o que acontece com uma variável dentro de uma função? Tipo: Code: int func() { int a = 5;
return a; }
Nesse código, quando a função é invocada, o compilador gera um código que faz +/- o seguinte: "reserva" um espaço para um int na pilha (4 bytes se for um compilador 32 bits), coloca o valor 5 nesse espaço. Quando o return é invocado, o valor da variável é salvo (pode ser num registrador, na própria pilha, não importa), a questão é que o espaço de memória alocado para a variável `a` é devolvido e passa a ser memória livre, em outras palavras, a variável não existe mais. Agora, se você cria uma referência para essa variável e retorna ela, o que acontece? Você tem uma referência apontando para algo que não existe mais. T+
_________________ Quer aprender a fazer jogos? http://www.pontov.com.br/ Meus jogos
|
|
| Topo |
|
 |
|
CPeixoto
|
Assunto da Mensagem: Re: Erro de compilação ao sobrecarregar operador + Enviado: 24 Abr 2012, 07:22 |
|
| Membro Ativo |
 |
Registado: 21 Abr 2012, 16:43 Mensagens: 158
|
Ok. Entendi sua explicação, mas acho que o que estou querendo perguntar é o seguinte: 1 - Qual o papel ou relevância de se usar referência na situação apresentada pelo programa. Já compilei o programa com as linhas: Code: Sobrecarga& operator++(); Sobrecarga& Sobrecarga::operator++() { // Corpo função }
E Code: Sobrecarga operator++(); Sobrecarga Sobrecarga::operator++() { // Corpo função }
E não fez diferença alguma. A compilação foi bem sucedida, qual a diferença prática ? 2 – Como fazer para mostrar o valor de a, na tela, após rodar o programa; se não consigo usar cout ? Obrigado
|
|
| Topo |
|
 |
|
bcsanches2
|
Assunto da Mensagem: Re: Erro de compilação ao sobrecarregar operador + Enviado: 24 Abr 2012, 09:37 |
|
Registado: 23 Nov 2003, 18:58 Mensagens: 2808 Localização: Brasil
|
Quote: E não fez diferença alguma. A compilação foi bem sucedida, qual a diferença prática ? Nesse caso nenhum (ignorando o fato de você retornar uma referência inválida), poderia ser util se o custo de criação de um objeto desses fosse alto e você tivesse algum mecanismo de re-usar objetos, assim poderia retornar a referência para um objeto já existente ao invés de criar um novo toda vez que o operador fosse usado. Quote: 2 – Como fazer para mostrar o valor de a, na tela, após rodar o programa; se não consigo usar cout ? Algumas opções: 1 - Adicione métodos getX e getY que retornem respectivamente os valores de x e y e use eles com cout 2 - Crie uma sobrecarga do operador << para sua classe, como mostrado aqui: http://msdn.microsoft.com/en-us/library/1z2f6c2k(v=vs.80).aspxT+
_________________ Quer aprender a fazer jogos? http://www.pontov.com.br/ Meus jogos
|
|
| Topo |
|
 |
|
CPeixoto
|
Assunto da Mensagem: Re: Erro de compilação ao sobrecarregar operador + Enviado: 24 Abr 2012, 15:24 |
|
| Membro Ativo |
 |
Registado: 21 Abr 2012, 16:43 Mensagens: 158
|
Veja a nova versão do programa, procurei seguir o modelo, mas depois das mudanças surgiram muitos erros. Veja: Code: #include <iostream> #include <cstdlib> using namespace std; class Sobrecarga { private: double x,y,n, saida_tela; public: //Construtor Sobrecarga(double num, 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 num, double valor) { n = num; saida_tela=valor; } Sobrecarga Sobrecarga::operator+(Sobrecarga s1) { Sobrecarga temp(0.0); temp.x= x + s1.x; temp.y= y + s1.y; return temp; } ostream &operator<<(ostream& os, Sobrecarga obj) { os << obj.saida_tela; return os; } int main() { cout << "sobrecarga de operadores " << endl; Sobrecarga a(6.0); a++; //cout << obj << endl; return 0; }
Erros: Quote: Sobrecarga_operador.cpp:60:21: error: no matching function for call to 'Sobrecarga::Sobrecarga(double)' Sobrecarga_operador.cpp:60:21: note: candidates are: Sobrecarga_operador.cpp:25:1: note: Sobrecarga::Sobrecarga(double, double) Sobrecarga_operador.cpp:25:1: note: candidate expects 2 arguments, 1 provided Sobrecarga_operador.cpp:6:7: note: Sobrecarga::Sobrecarga(const Sobrecarga&) Sobrecarga_operador.cpp:6:7: note: no known conversion for argument 1 from 'double' to 'const Sobrecarga&' Sobrecarga_operador.cpp:76:22: error: no matching function for call to 'Sobrecarga::Sobrecarga(double)' Sobrecarga_operador.cpp:76:22: note: candidates are: Sobrecarga_operador.cpp:25:1: note: Sobrecarga::Sobrecarga(double, double) Sobrecarga_operador.cpp:25:1: note: candidate expects 2 arguments, 1 provided Sobrecarga_operador.cpp:6:7: note: Sobrecarga::Sobrecarga(const Sobrecarga&) Sobrecarga_operador.cpp:6:7: note: no known conversion for argument 1 from 'double' to 'const Sobrecarga&'
Poderia ajudar na correção ? Obrigado
|
|
| Topo |
|
 |
|
bcsanches2
|
Assunto da Mensagem: Re: Erro de compilação ao sobrecarregar operador + Enviado: 24 Abr 2012, 15:28 |
|
Registado: 23 Nov 2003, 18:58 Mensagens: 2808 Localização: Brasil
|
|
Já pensou em ler algum material bem básico de programação? Que explique métodos, classes, parâmetros, construtores, destrutores?
Seus erros são todos relacionados a esses conceitos básicos...
Sem falar que as mensagens de erro do compilador já dão dicas bem clara dos problemas.
T+
_________________ Quer aprender a fazer jogos? http://www.pontov.com.br/ Meus jogos
|
|
| Topo |
|
 |
|
CPeixoto
|
Assunto da Mensagem: Re: Erro de compilação ao sobrecarregar operador + Enviado: 24 Abr 2012, 16:46 |
|
| Membro Ativo |
 |
Registado: 21 Abr 2012, 16:43 Mensagens: 158
|
|
Já li os livros citados acima. Só que sobrecarga de operadores não parece basico.
Veja que depois que sobrecarregue << é que apareceram estes erros. Nos Livros do DEITEL quase não fala nisso, e no Schildt é praticamente jogado.
Por isso estou recorrendo ao forum. Se não fosse a resposta anterior, não saberia que teria que sobrecaregar << para mostra a.
Poderia ajudar corrigindo o programa ? se puder poderei avançar no meu estudo.
Obrigado
|
|
| Topo |
|
 |
|
bcsanches2
|
Assunto da Mensagem: Re: Erro de compilação ao sobrecarregar operador + Enviado: 24 Abr 2012, 16:50 |
|
Registado: 23 Nov 2003, 18:58 Mensagens: 2808 Localização: Brasil
|
|
Os erros do seu ultimo post, nenhum tem relação com os operadores que você sobrecarregou, apenas no construtor, que você adicionou um parâmetro a mais e não usa ele quando cria o objeto.
A impressão que da é que você não entende nem um pouquinho o que esta fazendo, mesmo se você tirar os operadores sobrecarregados seu código ainda vai apresentar erros que são de construções básicas do C++, por isso a sugestão de dar uma treinada e entender o básico antes.
T+
_________________ Quer aprender a fazer jogos? http://www.pontov.com.br/ Meus jogos
|
|
| Topo |
|
 |
|
CPeixoto
|
Assunto da Mensagem: Re: Erro de compilação ao sobrecarregar operador + Enviado: 25 Abr 2012, 08:10 |
|
| Membro Ativo |
 |
Registado: 21 Abr 2012, 16:43 Mensagens: 158
|
Após revisar o programa, fica a questão: Como mostrar o resultado de uma função de operador sobrecarregada ? ambas as saídas mostram o mesmo resultado. Veja o código: Code: 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 Quote: sobrecarga de operadores 6 6 Pressione qualquer tecla para continuar. .
Obrigado
|
|
| Topo |
|
 |
Quem está ligado: |
Utilizadores a ver este Fórum: Nenhum utilizador registado e 4 visitantes |
|
Criar Tópicos: Proibído Responder Tópicos: Proibído Editar Mensagens: Proibído Apagar Mensagens: Proibído
|
|
 |
|

|
 |