Peixoto 0 Denunciar post Postado Março 11, 2012 :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
Renato Utsch 24 Denunciar post Postado Março 11, 2012 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
Peixoto 0 Denunciar post Postado Março 12, 2012 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 argumentSobrecarga_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
Renato Utsch 24 Denunciar post Postado Março 12, 2012 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
Peixoto 0 Denunciar post Postado Março 14, 2012 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
Renato Utsch 24 Denunciar post Postado Março 14, 2012 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
Peixoto 0 Denunciar post Postado Março 15, 2012 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
Renato Utsch 24 Denunciar post Postado Março 15, 2012 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
Peixoto 0 Denunciar post Postado Março 17, 2012 :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
Renato Utsch 24 Denunciar post Postado Março 18, 2012 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
Peixoto 0 Denunciar post Postado Março 18, 2012 :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
Renato Utsch 24 Denunciar post Postado Março 18, 2012 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
Peixoto 0 Denunciar post Postado Março 18, 2012 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