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. ?
Pergunta
Castro
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
Erros: 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 Veja versão 01-a Que funciona, mas que ficou mais complicada Versão 02 Um segundo programa foi tirado da pág. 393 O erro cai na linha E os erros são: Neste casso, o programa está exatamente como lá. O que está errado ? Uma terceira versão do programa Versão 03 O erro cai na linhaPoderia 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 CastroLink para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
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.