Ir ao conteúdo

Posts recomendados

Postado

Boa noite, estou desenvolvendo um código em c++ que faz a sobrecarga dos operadores "++", "--", "<<" e ">>" e estou encontrando dificuldades para juntar as duas coisas. Meu código está assim:

<>

#include "inteiro.h"
#include <iostream>
using namespace std;

InteiroEspecial::InteiroEspecial(int y){x = y;};

InteiroEspecial& InteiroEspecial::operator++(){
  x++;
  return *this;
}

InteiroEspecial& InteiroEspecial::operator--(){
  x--;
  return *this;
}

InteiroEspecial InteiroEspecial::operator++(int){
  InteiroEspecial temp = *this;
  ++*this;
  return temp;
}

InteiroEspecial InteiroEspecial::operator--(int){
  InteiroEspecial temp = *this;
  --*this;
  return temp;
}

ostream& operator<<(ostream& out, InteiroEspecial& c){
  out << c;
  return out;
}

istream& operator>>(istream& in, InteiroEspecial& c){
  in >> c;
  return in;
}

int main() {
 InteiroEspecial v1;
 InteiroEspecial v2;
 cout << "[Exercicio 01]" << endl;
 cout << "Entre com o valor v1: ";
 cin >> v1;
 cout << "Entre com o valor v2: ";
 cin >> v2;
 cout << "Pos-Incremento de v1 (+2): " << v1++ << endl;
 cout << "Pre-Incremento de v1 (+2): " << ++v1 << endl;
 cout << "Pos-Decremento de v2 (-5): " << v2-- << endl;
 cout << "Pre-Decremento de v2 (-5): " << --v2 << endl;
 cout << "[FIM do Exercicio 01]" << endl;
}

 

Só que eu não estou conseguindo imprimir v1++, etc porque eu não sei o que colocar na sobrecarga de "<<" e ">>". Se alguém puder me ajudar eu agradeço.

 

Postado

Imagino que a classe InteiroEspecial seja bem pequena.

 

Porque não postou o header?

 

Porque não escreveu tudo junto?

 

1 hora atrás, Gabriel Nichio disse:

porque eu não sei o que colocar na sobrecarga de "<<" e ">>"

 

Essa é uma afirmação curiosa, porque foi você que criou a classe e redefiniu esses operadores e é isso que define o que tem que "colocar".

 

Pelo modo como declarou sugiro deixar essas funções FORA da classe e declarar como friend para poder ter acesso à classe, ou usar uma struct ou declarar tudo público na classe.

 

O que você escreveu? está retornando streams. Referência a streams então o que vai "colocar" é

 

algo como cout << v ou cin >> v;

 

 

  • Curtir 1
Postado

Usando o tal botão code como descrito no primeiro tópico aqui seu programa ficaria
 

#include "inteiro.h"
#include <iostream>
using namespace std;

InteiroEspecial::InteiroEspecial(int y){x = y;};

InteiroEspecial& InteiroEspecial::operator++(){
  x++;
  return *this;
}

InteiroEspecial& InteiroEspecial::operator--(){
  x--;
  return *this;
}

InteiroEspecial InteiroEspecial::operator++(int){
  InteiroEspecial temp = *this;
  ++*this;
  return temp;
}

InteiroEspecial InteiroEspecial::operator--(int){
  InteiroEspecial temp = *this;
  --*this;
  return temp;
}

ostream& operator<<(ostream& out, InteiroEspecial& c){
  out << c;
  return out;
}

istream& operator>>(istream& in, InteiroEspecial& c){
  in >> c;
  return in;
}

int main() {
 InteiroEspecial v1;
 InteiroEspecial v2;
 cout << "[Exercicio 01]" << endl;
 cout << "Entre com o valor v1: ";
 cin >> v1;
 cout << "Entre com o valor v2: ";
 cin >> v2;
 cout << "Pos-Incremento de v1 (+2): " << v1++ << endl;
 cout << "Pre-Incremento de v1 (+2): " << ++v1 << endl;
 cout << "Pos-Decremento de v2 (-5): " << v2-- << endl;
 cout << "Pre-Decremento de v2 (-5): " << --v2 << endl;
 cout << "[FIM do Exercicio 01]" << endl;
}

 

Mais sobre seu programa

 

InteiroEspecial InteiroEspecial::operator++(int)
{
    InteiroEspecial temp = *this;
    ++*this;
    return temp;
}

 

Não precisa escrever assim e char a outra função porque pode simplesmente usar o incremento no parâmetro ao invés de usar o overload de antes. É muito mais eficiente.

 

Os testes como escreveu não são suficientes para demonstrar a mecânica.

 

Crie o construtor padrão. Ajuda  a testar.

 

Um exemplo completo

 

#include <iostream>

using namespace std;

struct InteiroEspecial
{
    int o_int;
    InteiroEspecial(int y) : o_int(y){};
    InteiroEspecial() : InteiroEspecial(0){};

    InteiroEspecial& operator++()
    {
        o_int += 1;
        return *this;
    }

    InteiroEspecial& operator--()
    {
        o_int -= 1;
        return *this;
    }

    InteiroEspecial operator++(int a)
    {
        InteiroEspecial temp(*this);
        o_int += 1;
        return temp;
    }

    InteiroEspecial operator--(int a)
    {
        InteiroEspecial temp(*this);
        o_int -= 1;
        return temp;
    }

    friend ostream& operator<<(ostream& out, InteiroEspecial& c);
    friend istream& operator>>(istream& in, InteiroEspecial& c);
};

ostream& operator<<(ostream& out, InteiroEspecial& c)
{
    out << "Especial(" << c.o_int << ")";
    return out;
}

istream& operator>>(istream& in, InteiroEspecial& c)
{
    std::cout << "\n(Novo >>) Entre com o valor do InteiroEspecial: ";
    in >> c.o_int;
    return in;
}

int main()
{
    InteiroEspecial v1(42);
    InteiroEspecial v2(-42);
    InteiroEspecial v3;

    cout << "v1 = " << v1 << "\n";
    cout << "v2 = " << v2 << "\n";
    cout << "v3 = " << v3 << "\n";

    v3 = ++v1;  // soma e depois copia
    cout << "depois de v3 = ++v1: v3 = " << v3 << " v1 = " << v1
         << "\n";
    v3 = v1++;  // copia primeiro, soma depois
    cout << "depois de v3 = v1++: v3 = " << v3 << " v1 = " << v1
         << "\n";

    v3 = --v1;  // soma e depois copia
    cout << "depois de v3 = --v1: v3 = " << v3 << " v1 = " << v1
         << "\n";
    v3 = v1--;  // copia primeiro, soma depois
    cout << "depois de v3 = v1--: v3 = " << v3 << " v1 = " << v1
         << "\n";

    cin >> v2;
    cout << v2;
}

 

A saída

 

v1 = Especial(42)
v2 = Especial(-42)
v3 = Especial(0)
depois de v3 = ++v1: v3 = Especial(43) v1 = Especial(43)
depois de v3 = v1++: v3 = Especial(43) v1 = Especial(44)
depois de v3 = --v1: v3 = Especial(43) v1 = Especial(43)
depois de v3 = v1--: v3 = Especial(43) v1 = Especial(42)

(Novo >>) Entre com o valor do InteiroEspecial: 145
Especial(145)

 

Sugiro que rode esse programa e entenda

 

  • porque precisa do construtor padrão
  • como diferenciar o >> redefinido
  • como acompanhar o incremento e decremento nas duas versões

 

  • A razão de deixar os arquivos no mesmo arquivo enquanto esta uma classe tão pequena.

Nesse caso a declaração dos overloads como friend é opcional mas é muito importante entender que os operadores estão FORA da classe e assim essa declaração é essencial para garantir acesso às variáveis da instância no caso de classes comuns.

  • Curtir 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!