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
#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: 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#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 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//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 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.