Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Peixoto

Sobrecarga de cout

Recommended Posts

:upset:

 

Como sobrecarregar cout ?

 

#include <iostream>
#include <cstdlib>
using namespace std;

class Mostra
{    double v;    
   public:
   Mostra (double a) {v=a;}

};

int main()
{
   Mostra a(2.6);

   cout << a;    
   system ("pause");
return 0;
}

ostream& operator<< (ostream& out, Mostra& valor)
{
 out << "Mostra:" << valor.v << endl;
 return out;
}

 

Quando mando compilar o programa, a IDE congela. Se eu faço:

 

cout << v;

 

Recebo a seguinte menssagem de erro:

 

Sobrecarga_inser ao_1.cpp:17:13: error: 'v' was not declared in this scope

 

 

Por "v" não ser declarada em main(). Que fazer ?

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

v é declarado como private. Assim, você não pode acessá-lo da sobrecarga externa à classe.

 

O que me parece é que você esqueceu de adicionar a declaração do operator << na classe, não é?

 

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei se entendi o que você disse, então fiz a seguinte alteração:

#include <iostream>
#include <cstdlib>
using namespace std;

class Mostra
{	public:
 double v;	

Mostra (double a) {v=a;}
ostream& operator<< (ostream& out, Mostra& valor);

};

int main()
{
Mostra a(2.6);

   cout << v;     
system ("pause");
return 0;
} 

 

Veja os novos erros:

 

Sobrecarga_inser ao_1.cpp:11:50: error: 'std::ostream& Mostra::operator<<(std::ostream&, Mostra&)' must take exactly one argument

Sobrecarga_inser ao_1.cpp:19:13: error: 'v' was not declared in this scope

 

Não entendi onde estou errando.

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

No cout << v; você tentou mostrar uma variável não declarada. A variável é a.v, não esqueça.

 

E onde está a implementação de operator<< ?

 

 

Abraços :D

 

@edit:

 

Então, eu re-estudei toda essa parte, o código funcionando é esse abaixo:

 

#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;

class Mostra
{
public:
double v;      

Mostra(double a) { v = a; }           
};

ostream &operator<<(ostream &out, Mostra obj)
{
   out << obj.v;
   return out;
}

int main()
{
   Mostra exemplo(2.6);

   cout << exemplo;     
   getchar();
   return 0;
}

 

Desculpe-me pelas confusões que te fiz passar :D

 

 

Abraços!

Compartilhar este post


Link para o post
Compartilhar em outros sites

O programa abaixo, não tem erro de compilação, mas como posso sobrecarregar o operador cin? Ex: ao digitar 5, ao invés de 5 aparecer 101 em binário, em hexa ou qualquer coisa no gênero ou digitar uma letra e aparecer outra. Em resumo fazer cin fazer algo diferente ao entrar com um dado. Poderia ajudar ?

 

include <iostream>
#include <cstdlib>
using namespace std;

class Inserir
{

public:
double v;
	Inserir (double a) {v=a;}
};

istream& operator>> (istream& in, Inserir& valor)
{

in >> valor.v;
return in;
}


int main()
{
Inserir a(2.6);

   cin >> a;    
system ("pause");
return 0;
}

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha mano, o que você está fazendo acima é, ao dar cin >> a você salvar o que o cin coletou na variável a.v.

 

Só isso. É isso que você queria? Porque não entendi o que quis dizer.

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então pensa dessa forma: considerando o programa acima, como sobrecarregar cin? Qual alteração no programa para isso acontecer ?

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você sobrecarregou o cin.

 

Na hora que você dá cin >> a, você está salvando o que o cin pegou do stdin na variável a.v, e não na variável a comum.

 

 

Por isso não entendi sua dúvida.

 

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

:grin:

 

Ok. Agora Considere as duas formas:

 

Exemplo 1

 

istream &prompt(istream &stream)
   {
cin >> hex;
        cout << "Entre com numero em formato hexadecimal: ";
 return stream;
 }

 

Neste caso, no livro do Herbert Schildt, afirma-se que se está criando uma função personalizada de entrada. No livro do autor, pag. 495, a função não está presa a classe alguma; diferentemente do exemplo 2.

 

Exemplo 2

 

istream& operator>> (istream& in, Inserir& valor)
{
 in >> valor.v;
return in;
}

 

No caso da função do programa acima, exemplo 2, se diz que se está sobrecarregando cin. Existe alguma diferença de conceito, realmente,entre estes dois exemplos ou é tudo sobrecarga ?

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pelo que deu para entender, a primeira função cria algo similar ao cin, mas que mostra uma mensagem após ele, enquanto a 2ª implementação sobrecarga cin.

 

O que dá para dizer é que não são a mesma coisa. Ainda mais que a 1ª função não vai mudar a forma de input mesmo que mudemos a stream, ou seja, não vi muito sentido na função não...

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

:grin:

 

Ok. Outra coisa que me chama a atenção, é o fato destas funções só funcionarem se forem implementadas antes de main(). Por quê ?

 

Se eu um fizer:

 

int main()
  {
   Inserir a(2.6);

   cin >> a;    
   return 0;
}

istream& operator>> (istream& in, Inserir& valor)
{

in >> valor.v;
return in;
}

 

Ao compilar dará erro de compilação.

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que você entende sobre protótipos, né? Você tem que tornar uma função visível antes de poder usá-la. Aqui é o mesmo caso.

 

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz o teste

 

class Mostra
{
public:
       double v;      

       Mostra(double a) { v = a; } 
       ostream &operator<<(ostream &out, Mostra obj);          
};


int main()
{
   Mostra exemplo(2.6);

   cout << exemplo << endl;     
   system ("pause");
}

 

E ao compilar a IDE congelou. Que há de errado.

 

Obrido

ostream &operator<<(ostream &out, Mostra obj)

{

out << obj.v;

return out;

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.