paulo1205
(usa Ubuntu)
Enviado em 01/11/2015 - 09:18h
murilogoes escreveu:
Pessoal, existe a possibilidade de eu utilizar os valores de uma variável que pertence a uma outra classe??? Resumi minha dúvida neste pequeno código para vocês entenderem o que eu quero. Se vocês rodarem, verão que na hora de exibir a variável na outra classe os valores aparecem todos sujos:
Objetivamente falando, seu programa imprime lixo porque você lê os dados para um objeto (
l ), e manda imprimir dados de outro objeto (
e ), que nunca teve dados lidos.
Lembre que
Leitura e
Exibicao são nomes dos tipos de dados. Os objetos, que efetivamente armazenam dados de seus respectivos tipos, são, no seu caso,
l e
e . Um jeito de fazer imprimir corretamente é chamar
e.leVetor (),
mas só o será realmente depois que você consertar o bug de usar, tanto na hora de ler quanto na de escrever, cinco posições para aceder a um vetor declarado com apenas quatro elementos.
Isso faria o programa funcionar, mas ele ainda seria bem estranho. Começando pelos nomes das classes, que fogem do que seria esperado, uma vez que denotam operações, e não objetos. Também me parece estranho que a "exibição" seja uma extensão da "leitura".
Existe ainda o fato esquisito de que suas classes são completamente abertas, com todos os membros públicos. Sendo tão aberta (e sendo, como já se observou que você definiu a exibição como uma derivação da leitura), o uso de
friend acaba sendo desnecessário. Na verdade, usar
friend raramente é necessário, especialmente quando a revelação de alguns aspectos do dado representado pelo objeto não constituir um risco.
Um exemplo mais realista, usando funções
friend para entrada e saída, poderia ser o seguinte.
#include <iostream>
using namespace std;
template <unsigned N> class vetor {
private:
int v[N];
template <unsigned M> friend istream &operator>>(istream &, vetor<M> &);
template <unsigned M> friend ostream &operator<<(ostream &, const vetor<M> &);
};
template <unsigned N> istream &operator>>(istream &is, vetor<N> &vet){
for(unsigned n=0; n<N && is; n++)
is >> vet.v[n];
return is;
}
template <unsigned N> ostream &operator<<(ostream &os, const vetor<N> &vet){
for(unsigned n=0; n<N-1 && os; n++)
os << vet.v[n] << ' ';
if(os)
os << vet.v[N-1];
return os;
}
int main(){
vetor<5> v;
cout << "Digite 5 valores inteiros: ";
if(cin >> v)
cout << "Os valores lidos foram: " << v << '\n';
else
cerr << "Erro na leitura do vetor.\n";
}
No entanto, eu acho que a versão abaixo, sem
friend s, seria ainda mais realista.
#include <iostream>
using namespace std;
template <unsigned N> class vetor {
private:
int v[N];
public:
int &operator[](unsigned n){
return v[n];
}
int operator[](unsigned n) const {
return v[n];
}
};
template <unsigned N> istream &operator>>(istream &is, vetor<N> &vet){
for(unsigned n=0; n<N && is; n++)
is >> vet[n];
return is;
}
template <unsigned N> ostream &operator<<(ostream &os, const vetor<N> &vet){
if(N>0){
for(unsigned n=0; n<N-1 && os; n++)
os << vet[n] << ' ';
if(os)
os << vet[N-1];
}
return os;
}
int main(){
vetor<5> v;
cout << "Digite 5 valores inteiros: ";
if(cin >> v)
cout << "Os valores lidos foram: " << v << '\n';
else
cerr << "Erro na leitura do vetor.\n";
}
E, já que é para brincar, por que só vetores de inteiros?
#include <iostream>
#include <string>
using namespace std;
template <typename T> class base_vetor {
private:
string sep;
public:
base_vetor(): sep(" ") { }
virtual unsigned size() const =0;
virtual T &operator[](unsigned) =0;
virtual const T &operator[](unsigned) const =0;
const string &separator() const { return sep; }
void separator(const string &s){ sep=s; }
};
template <typename T, unsigned N> class vetor: public base_vetor<T> {
private:
T v[N];
public:
unsigned size() const { return N; }
T &operator[](unsigned n){ return v[n]; }
const T &operator[](unsigned n) const { return v[n]; }
};
template <typename T> istream &operator>>(istream &is, base_vetor<T> &vet){
unsigned size=vet.size();
for(unsigned n=0; n<size && is; n++)
is >> vet[n];
return is;
}
template <typename T> ostream &operator<<(ostream &os, const base_vetor<T> &vet){
unsigned last;
if((last=vet.size())-- > 0){
for(unsigned n=0; n<last && os; n++)
os << vet[n] << vet.separator();
if(os)
os << vet[last];
}
return os;
}
int main(){
vetor<int, 5> vi;
cout << "Digite " << vi.size() << " valores inteiros: ";
if(cin >> vi)
cout << "Os valores lidos foram: " << vi << '\n';
else{
cerr << "Erro durante leitura do vetor de inteiros.\n";
return 1;
}
vetor<double, 3> vd;
cout << "\nDigite " << vd.size() << " valores reais: ";
if(cin >> vd)
cout << "Os valores lidos foram: " << vd << '\n';
else{
cerr << "Erro durante leitura do vetor de reais.\n";
return 1;
}
vetor<string, 4> vs;
cout << "\nDigite " << vs.size() << " nomes de frutas: ";
if(cin >> vs){
vs.separator(", ");
cout << "As frutas lidas foram: " << vs << '\n';
}
else{
cerr << "Erro durante leitura do vetor de reais.\n";
return 1;
}
vetor<vetor<double, 3>, 2> mat2x3;
cout << "\nDigite os elementos reais de uma matriz 2x3: ";
if(cin >> mat2x3){
mat2x3.separator("]\n [");
cout << "A matriz tem os seguintes elementos:\n[[" << mat2x3 << "]]\n";
}
else{
cerr << "Erro durante a leitura da matriz.\n";
return 1;
}
}