[ +/- ] [ Data/Hora: 19 Mai 2013, 20:39 ]


Criar um novo TópicoWrite comments Página 1 de 1   [ 13 posts ]
Autor Mensagem
 Assunto da Mensagem: Erro de compilação ao sobrecarregar operador +
MensagemEnviado: 21 Abr 2012, 17:13 
Membro Ativo
Avatar do Utilizador

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
 Perfil  
 
 Assunto da Mensagem: Re: Erro de compilação ao sobrecarregar operador +
MensagemEnviado: 22 Abr 2012, 09:20 
Membro Ativo

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
 Perfil  
 
The following user would like to thank fpissarra for his or her post: Visitante
 Assunto da Mensagem: Re: Erro de compilação ao sobrecarregar operador +
MensagemEnviado: 22 Abr 2012, 12:59 
Membro Ativo
Avatar do Utilizador

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
 Perfil  
 
 Assunto da Mensagem: Re: Erro de compilação ao sobrecarregar operador +
MensagemEnviado: 22 Abr 2012, 23:54 
Membro Avançado

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
 Perfil  
 
The following user would like to thank bcsanches2 for his or her post: Visitante
 Assunto da Mensagem: Re: Erro de compilação ao sobrecarregar operador +
MensagemEnviado: 23 Abr 2012, 08:40 
Membro Ativo
Avatar do Utilizador

Registado: 21 Abr 2012, 16:43
Mensagens: 158
:D

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
 Perfil  
 
 Assunto da Mensagem: Re: Erro de compilação ao sobrecarregar operador +
MensagemEnviado: 23 Abr 2012, 09:28 
Membro Avançado

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
 Perfil  
 
 Assunto da Mensagem: Re: Erro de compilação ao sobrecarregar operador +
MensagemEnviado: 24 Abr 2012, 07:22 
Membro Ativo
Avatar do Utilizador

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
 Perfil  
 
 Assunto da Mensagem: Re: Erro de compilação ao sobrecarregar operador +
MensagemEnviado: 24 Abr 2012, 09:37 
Membro Avançado

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

T+

_________________
Quer aprender a fazer jogos?
http://www.pontov.com.br/
Meus jogos


Topo
 Perfil  
 
 Assunto da Mensagem: Re: Erro de compilação ao sobrecarregar operador +
MensagemEnviado: 24 Abr 2012, 15:24 
Membro Ativo
Avatar do Utilizador

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
 Perfil  
 
 Assunto da Mensagem: Re: Erro de compilação ao sobrecarregar operador +
MensagemEnviado: 24 Abr 2012, 15:28 
Membro Avançado

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
 Perfil  
 
 Assunto da Mensagem: Re: Erro de compilação ao sobrecarregar operador +
MensagemEnviado: 24 Abr 2012, 16:46 
Membro Ativo
Avatar do Utilizador

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
 Perfil  
 
 Assunto da Mensagem: Re: Erro de compilação ao sobrecarregar operador +
MensagemEnviado: 24 Abr 2012, 16:50 
Membro Avançado

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
 Perfil  
 
 Assunto da Mensagem: Re: Erro de compilação ao sobrecarregar operador +
MensagemEnviado: 25 Abr 2012, 08:10 
Membro Ativo
Avatar do Utilizador

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
 Perfil  
 
Mostrar mensagens anteriores:  Ordenar por  
Criar um novo TópicoWrite comments Página 1 de 1   [ 13 posts ]
Similar topics
Erro ao incluir allegro.h
Fórum: Allegro
Autor: DooMAGE
Respostas: 5
Ponteiros e Struct: Erro de Memória
Fórum: C/C++
Autor: kao00
Respostas: 4
duiva com função operador não-membro
Fórum: C/C++
Autor: _GuGa_
Respostas: 3
jvcl - erro na instalação.
Fórum: Pascal/Delphi
Autor: ACDias
Respostas: 2
Erro ao entrar no jogo!!!
Fórum: 3D Game Studio
Autor: alexiis
Respostas: 1
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

Pesquisar por:
Ir para:  

cron


Powered by phpBB ©

Virtual Object Informtica Ltda. Fone/Fax: (15)3231-6840