Ir ao conteúdo
  • Cadastre-se

C++ Impressão de incremento com sobrecarga de operadores dando errado


Gabriel Nichio

Posts recomendados

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.

 

Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

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...