Ir para conteúdo
Fórum Script Brasil
  • 0

Tentando entender sobrecarga de operadores


Castro

Pergunta

Estou tentando entender sobrecarga de operadores, mas os exemplo que tenho são complicado e ainda tem erros. Vejamos: No livro “C++ guia para iniciantes” do Schild, na página 389, há um programa que tem vários erro de digitação. Eu tentei corrigir, mas não deu muito certo, veja a primeira versão dele

Versão 01

#include <iostream>
using namespace std;

class ThreaD
{
      int x,y,z; //coordenadas 3-D
      public:
      ThreaD {x=y=z=0;}
      ThreaD (int i, int j,int k){x=i;y=j; z=k;}
      
      ThreaD operator+ (ThreaD op2);
      ThreaD operator+ (=ThreaD op2);
      
      void show ();
};
//sobrecarrege +

ThreaD ThreaD:operator+(ThreaD op2) //sobrecarregue + para ThreaD
{
 ThreaD temp;

 temp.x =x + op2.x; // Há adições de numero inteiro
      
 temp.y =y + op2.y; // e o + contém seu original

 temp.z =z + op2.z; // sguinificado relativo a eles

 return temp; // Retorne um novo objeto. Deixe os argumentos inalterados
}
//Sobrecarregue a atribuição

ThreaD ThreaD : operator=(ThreaD op2) //Sobrecarregue = para ThreaD
{
 x=op2.x // Há atribuições de numero inteiro

 y=op2.y //e o = contem seu original

 z= op2.z // siguinificado relativo a eles

 return *this; //retorna o objeto modificado
}

//Mostra as coordenadas X,Y,Z

void ThreaD::show()
{
     cout << x << ",";
     cout << y << ",";
     cout << z << ",";
}
        
int main()
{
     ThreaD a (1,2,3), b(10,10,10),c;
     
     cout << "Valores originais";
     
     a.show();
     
     cout << "Valores originais";
     b.show();
     
     cout << "\n";
     
     c = a + b + c; // adicione a,b e c juntos
     
     cout << "Valor de c apos c = a + b + c \n";
     
     c.show();
     
     cout << "\n";
     
     c=b=a; //demonstra multipla atribuição
     
     cout << "Valor de c apos c = b = a: \n";
     
     c.show();
 return 0;   
}
Erros:
8 D:\Sobre_C++\Livro C++guia para iniciantes\Sobrecarga_operadores.cpp expected unqualified-id before '{' token 12 D:\Sobre_C++\Livro C++guia para iniciantes\Sobrecarga_operadores.cpp declaration of `operator+' as non-function 12 D:\Sobre_C++\Livro C++guia para iniciantes\Sobrecarga_operadores.cpp expected `;' before '(' token 18 D:\Sobre_C++\Livro C++guia para iniciantes\Sobrecarga_operadores.cpp invalid function declaration 32 D:\Sobre_C++\Livro C++guia para iniciantes\Sobrecarga_operadores.cpp invalid function declaration D:\Sobre_C++\Livro C++guia para iniciantes\Sobrecarga_operadores.cpp In function `int main()': 54 D:\Sobre_C++\Livro C++guia para iniciantes\Sobrecarga_operadores.cpp no matching function for call to `ThreaD::ThreaD()' note D:\Sobre_C++\Livro C++guia para iniciantes\Sobrecarga_operadores.cpp:5 candidates are: ThreaD::ThreaD(const ThreaD&) note D:\Sobre_C++\Livro C++guia para iniciantes\Sobrecarga_operadores.cpp:5 ThreaD::ThreaD(int, int, int)
Pessoas tentando me ajudar passaram uma segunda versão que funciona, mas ficou mais complicado, pois criou-se um novo objeto passado por referência além de passar objeto constante
ThreaD operator+(const ThreaD & novo_ThreaD);
Veja versão 01-a
#include<iostream>
using namespace std;

class ThreaD
{ 
int x,y,z; //coordenadas 3-D
public: 
ThreaD (int i, int j, int k);
ThreaD operator+(const ThreaD & novo_ThreaD);
ThreaD & operator=(const ThreaD & novo_ThreaD); 
void show ();
};

//construtor
ThreaD::ThreaD (int i, int j, int k)
{
x=i; y=j; z=k;
}

//sobrecarrege +
ThreaD ThreaD::operator+(const ThreaD & novo_ThreaD) //sobrecarregue + para ThreaD
{
ThreaD temp(0,0,0);
temp.x = x + novo_ThreaD.x; 
temp.y = y + novo_ThreaD.y;
temp.z = z + novo_ThreaD.z;
return temp;
}
//Sobrecarregue a atribuição 
ThreaD & ThreaD::operator=(const ThreaD & novo_ThreaD) //Sobrecarregue = para ThreaD
{ 
x = novo_ThreaD.x; 
y = novo_ThreaD.y;
z = novo_ThreaD.z;
return *this; //retorna o objeto modificado
}

//Mostra as coordenadas X,Y,Z 
void ThreaD::show()
{
cout << x << "," << y << "," << z << endl;
}

int main()
{
ThreaD a(1,2,3), b(10,10,10), c(0,0,0);

cout << "Valores originais de A: "; 
a.show(); 

cout << "Valores originais de B: ";
b.show(); 


cout << endl;

cout << "Valor de C apos [ c = a + b + c]\n";
c=c+a+b;
c.show(); 


c=b=a; //demonstra multipla atribuição 
cout << "Valor de C apos [ c = b = a ]\n"; 
c.show();
system ("pause");
return 0; 
}
Que funciona, mas que ficou mais complicada Versão 02 Um segundo programa foi tirado da pág. 393
//sobrecarga de operadores unários p 393
#include <iostream>
using namespace std;

class ThreaD
{
      int x,y,z; //coordenadas 3-D
      public:
      ThreaD() {x=y=z=0;}
      ThreaD (int i, int j,int k){x=i;y=j; z=k;}
      
      ThreaD operator++(); //versão de prefixo ++;
            
      void show();
};
//sobrecarrege a versão de prefixo ++

ThreaD ThreaD::operator++() //sobrecarregue ++ para ThreaD
{
 x++; // incremente x,y e z
 y++;
 z++;
  return *this; // Retorne o objeto incrementado
}

// Mostre as coordenadas,x,y,z

void  ThreaD::show()
{
      cout << x << ",";
      cout << y << ",";
      cout << z << "\n";
}      
int main()
{
    ThreeD a(1,2,3);
    cout << "valor original de a: ";
    a.show();
    ++a; // incremente a
    cout << "Valor de ++a: ";
    a.show();
 return 0;   
}
O erro cai na linha
ThreeD a(1,2,3);
E os erros são:
D:\Sobre_C++\Livro C++guia para iniciantes\Sobrecarga_operadores.cpp In function `int main()': 36 D:\Sobre_C++\Livro C++guia para iniciantes\Sobrecarga_operadores.cpp `ThreeD' undeclared (first use this function) (Each undeclared identifier is reported only once for each function it appears in.) 36 D:\Sobre_C++\Livro C++guia para iniciantes\Sobrecarga_operadores.cpp expected `;' before "a" 38 D:\Sobre_C++\Livro C++guia para iniciantes\Sobrecarga_operadores.cpp `a' undeclared (first use this function)
Neste casso, o programa está exatamente como lá. O que está errado ? Uma terceira versão do programa Versão 03
//sobrecarga de operadores função amiga p 399
#include <iostream>
using namespace std;

class ThreaD
{
      int x,y,z; //coordenadas 3-D
      public:
      ThreaD() {x=y=z=0;}
      ThreaD (int i, int j,int k){x=i;y=j; z=k;}
      
      friend ThreaD operator+(ThreaD op1, ThreaD op2); 
      /*Aqui operator+() é amiga de ThreaD observe que dois parâmetros
      são nescessários */
                  
      void show();
};
//O + é agora uma função amiga 


ThreaD operator+(ThreaD op1, ThreaD op2)
{
  ThreaD temp;
  
  temp.x=op1.x + op2.x; 
  temp.y=op1.y + op2.y;
  temp.z=op1.z + op2.z;
  
  return temp;
}    
// Mostre as coordenadas,x,y,z

void  ThreaD::show()
{
      cout << x << ",";
      cout << y << ",";
      cout << z << "\n";
}      
int main()
{
    ThreeD a (1,2,3), b(10,10,10),c;
    cout << "valor original de a: ";
    a.show();
    cout << "Original valor de b ";
    b.show();
    
    cout << "\n";
    
    c=a+b;
    
    cout << "valor de c depois c = a + b: ";
    c.show();
    cout << "\n"; 
    
    c=b=a;
    cout << "valor de c = b = a: ";
    c.show();
    
    cout << "valor de b depois c = b = a: ";
     b.show();
 return 0;   
}
O erro cai na linha
ThreeD a (1,2,3), b(10,10,10),c;

Poderia indicar qual a correção a ser feita na versão 02 e versão 03 ?

Está muito complicado entender este tema. Poderiam postar um exemplo “simples” de sobrecarga de operadores + = / etc. ?

Obrigado

Editado por Castro
Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,2k
×
×
  • Criar Novo...