Usar variável de outra classe em uma nova classe

1. Usar variável de outra classe em uma nova classe

Murilo Góes de Almeida
murilogoes

(usa Linux Mint)

Enviado em 31/10/2015 - 01:19h

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:

#include <iostream>

using namespace std;

class Leitura
{
friend class Exibicao;
public:
int vetor[4];
void LerVetor() // neste método vou ler 5 posições de um vetor
{
for(int i=0; i<5; i++)
{
cin >> vetor[i];
}
}
};

class Exibicao:public Leitura
{
public:
void ExibeVetor() // neste método desta nova classe eu quero exibir as posições inseridas daquele vetor da outra classe.
{
cout << endl;
for(int i=0; i<5; i++)
{
cout << vetor[i];
}
}
};

int main()
{
Leitura l;
Exibicao e;
l.LerVetor();
e.ExibeVetor();
return 0;
}



  


2. Re: Usar variável de outra classe em uma nova classe

Paulo
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 friends, 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;
}
}



3. Re: Usar variável de outra classe em uma nova classe

Murilo Góes de Almeida
murilogoes

(usa Linux Mint)

Enviado em 03/11/2015 - 10:03h

Obrigado, foi bem esclarecedor!!






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts