Classe Complex. Considere a classe Complex mostrada
nas figuras 19.20 a 19.22. A classe permite operações nos
chamados números complexos. Estes são números no formato
realPart + imaginaryPart * i, onde i tem o valor
a) Modifique a classe para permitir a entrada e a saída
de números complexos por meio de operadores >> e
remover a função print da classe).
b) Sobrecarregue o operador de multiplicação para
permitir a multiplicação de dois números complexos,
como na álgebra.
c) Sobrecarregue os operadores == e != para permitir
comparações de números complexos.
Passo 1
Vamos aprimorar a classe Complex. Adicionaremos a funcionalidade a objetos de aída/entrada desse tipo, multiplicaremos e compararemos os objetos.
Vamos declarar a classe com as funções adicionais no arquivo de cabeçalho "Complex.h" da seguinte forma.
Adicione as funções de sobrecarga do operador de extração/inserção como amigo para permitir o acesso a membros de dados privados da classe.
#ifndef H_COMPLEX_H
#define H_COMPLEX_H
#include
using namespace std;
class Complex {
friend ostream &operator
friend istream &operator>>(istream&, Complex&);
public:
Complex(double = 0.0, double = 0.0);
Complex operator+(const Complex&) const;
Complex operator-(const Complex&) const;
Complex operator*(const Complex&) const;
bool operator==(const Complex&) const;
bool operator!=(const Complex&) const;
private:
double real;
double imaginary;
};
#endif
Agora, vamos implementar as funções no arquivo fonte "Complex.cpp".
Em primeiro lugar, o cabeçalho do arquivo junto com as funções que já estão implementadas nas figuras da tarefa:
#include "Complex.h"
Complex::Complex(double realPart, double imaginaryPart)
: real(realPart), imaginary(imaginaryPart) {}
Complex Complex::operator+(const Complex &operand2) const
{
return Complex(real + operand2.real,
imaginary + operand2.imaginary);
}
Complex Complex::operator-(const Complex &operand2) const
{
return Complex(real - operand2.real,
imaginary - operand2.imaginary);
}
...
Passo 2
- A função de sobrecarga do operador de extração simplesmente utiliza o objeto ostream para gerar o objeto como ele foi gerado na função print() que removemos.
- Para multiplicar os objetos, use a aritmética dos números complexos:
- Para comparar os objetos, compararemos seus membros de dados da seguinte forma:
Certifique-se de retornar o objeto ostream para permitir o encadeamento de outras expressões de saída.
ostream &operator
output
return output;
}
O operador de inserção pegará dois valores duplos e os definirá no objeto da seguinte maneira. Além disso, certifique-se de retornar o objeto istream para permitir o encadeamento.
istream &operator>>(istream &input, Complex &c) {
input >> c.real >> c.imaginary;
return input;
}
Complex Complex::operator*(const Complex &operand2) const
{
return Complex(operand2.real * real +
operand2.imaginary * imaginary,
operand2.real * imaginary +
operand2.imaginary * real);
}
Passo 3
bool Complex::operator==(const Complex &c) const {
return c.real == real && c.imaginary == imaginary;
}
bool Complex::operator!=(const Complex &c) const {
return c.real != real || c.imaginary != imaginary;
}
O arquivo principal para fins de demonstração:
#include
#include "Complex.h"
using namespace std;
int main()
{
Complex c1(13.0, 27.0);
Complex c2;
cin >> c2;
Complex c3 = c1 * c2;
cout
if (c1 == c2)
cout
if (c1 != c2)
cout
}
Resposta
Ver desenvolvimento.