• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

pedruss

SOS - classe list com objectos

16 mensagens neste tópico

Boas,

Alguém me podia arranjar um link (de preferência em tuga mas se for em english tambem "se come" mas mal ;)) que me explicasse o funcionamento da classe genérica "list" para gravar objectos? A intenção é meter para a lista n objectos para poder ler, procurar e apagar os objectos inseridos... Dei uma vista no http://www.cppreference.com/ mas não percebi nicles...  :wallbash:

Obrigado.

Cumprimentos,

pedruss

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Antes de mais queria agradecer ao TheDark e pedir desculpa por só dar uma resposta hoje.....

Já li o site http://www.cprogramming.com/tutorial/stl/stllist.html e até compreendi, mas quando vou executar o ultimo exemplo o compilador dá um erro que não consigo compreender....

Código:

#include <iostream>
#include <list>
#include <string>

using namespace std;
using std::list;

int main(){
std::list<int> int_list;
int_list.push_back( 1 );
int_list.push_back( 1 );
int_list.push_back( 8 );
int_list.push_back( 9 );
int_list.push_back( 7 );
int_list.push_back( 8 );
int_list.push_back( 2 );
int_list.push_back( 3 );
int_list.push_back( 3 );
int_list.sort();
int_list.unique();

for(std::list<int>::iterator list_iter = int_list.begin(); 
	list_iter != int_list.end(); list_iter++)
{
	std::cout<<list_iter<<endl;
}
return 1;
}

E o erro que me dá é na linha onde tem "std::cout<<list_iter<<endl;",

sendo o erro: "error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'std::list<_Ty>::_Iterator<_Secure_validation>' (or there is no acceptable conversion)".

Alguém pode ajudar este pobre principiante? :-[

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tens de ver que o interator comporta-se como um ponteiro.

Provavelmente o que queres é

std::cout<<*list_iter<<endl;

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Brigadão, era mesmo isso!  :D

Já agora, meti na lista variáveis do tipo inteiro, será que poso colocar objectos numa lista?

Pois estou a fazer um trabalho que consiste numa loja onde tem as operações básica (operações com artigos, clientes, fornecedores e compras), e gostava de saber se posso colocar objectos nas listas, como por exemplo colocar na classe "Loja" a lista de objectos de clientes, isto é possível?

Sei que posso fazer por vectores de objectos (como Cliente * cliente[10]), mas assim fico limitado pelo número de objectos a inserir (neste caso só posso ter 10 clientes na loja, o que não é muito bom...), com as listas posso inserir quantos objectos "cliente" eu quiser, certo?

Mais uma vez Muito Obrigado por toda a ajuda que me deram!  :biggrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes por praticamente qualquer coisa nos templates. Tens de definir o operador "operator=", ou utilizar ponteiros.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes por praticamente qualquer coisa nos templates. Tens de definir o operador "operator=", ou utilizar ponteiros.

shumy, desculpa a minha ignorância, mas não estou a compreender...

A minha grande dúvida consiste em como é que eu posso guardar os objectos depois de fechada a aplicação.... Estou a fazer um projecto para a "escolinha" que consiste em fazer a gestão de clientes e artigos de uma loja... Em anexo envio o diagrama, o código correspondente e a minha pequena (grande) dúvida... :wallbash:

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mau... não foi isso que perguntaste no ultimo Post.

Guardar em files é outro assunto. Penso que o melhor é começar com uma função do tipo WriteToFile(ofstream& out) para a classe que queres guardar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tens razão shumy, desculpa! estive na pesquisa e vi que estava a confundir um pouco as coisas.... Coisas de iniciante.... :-[

Alguem me pode indicar um link ou exemplo de como gravar classes em ficheiros?

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso depende da definição da classe. Se não tiveres apontadores como membros, é simples. Se tiveres é um pouco mais complicado.

Vou dar um exemplo que te dê bases para adaptar ao teu problema. Se tiveres uma classe definida assim:

class Cliente {
int numero;
string nome;
public:
Cliente(int _numero, string _nome): numero(_numero), nome(_nome) {}
int getNumero() { return numero; }
string getNome() { return nome; }
};

podes implementar (como disse o shumy) uma função writeToFile(Cliente &c, ostream &out) e outra ReadFromFile(Cliente &c, istream &in) do seguinte modo:

void writeToFile(list<Cliente> &c, ostream &out) {
out << c.size() << '\n'; //numero de clientes a escrever no ficheiro
for (list<Cliente>::iterator i = c.begin(); i != c.end(); ++i)
	out << i->getNumero() << '\n' << i->getNome() << endl;
}

void readFromFile(list<Cliente> &c, istream &in) {
int sz;
in >> sz; //ler o numero de clientes presentes no ficheiro
int numero;
string nome;
for (int i=0; i<sz; ++i) {
	in >> numero;
	getline(in, nome); //ignorar o resto da linha do número
	getline(in, nome);
	c.push_back(Cliente(numero, nome));
}
}

para serem utilizadas assim:

int main(){
list<Cliente> clout, clin;
Cliente c1(1, "francelino"), c2(2, "francelino");
clout.push_back(c1);
clout.push_back(c2);

ofstream o("savefile.lst");
writeToFile(clout, o);
o.close();
ifstream i("savefile.lst");
readFromFile(clin, i);

return 0;
}

Agora modifica-as conforme as tuas classes. E qualquer dúvida já sabes :cheesygrin:

Agora que acabei, não sei se não estou a falar demais...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

TheDark, Muitíssimo Obrigado!!!

Quando estiver contigo pago-te um fino!!!!!  :biggrin:

Só não percebo uma "coisita"... Depois de criar os objectos, de gravar no ficheiro e de ler no ficheiro (carregar a lista), como faço para usar os objectos normalmente (ou seja, acedendo aos seus métodos)?

Obrigado, era mesmo isso!  :ipool:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acedes a cada objecto usando a notação de array:

int numCliente = clin[0].getNumero;

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas,

TheDark, desculpa mais uma vez... Estou a utilizar a notação que me disses-te mas está a dar erro...

Tenho o seguite:

int main(){
list<Cliente> clout, clin;
Cliente c1(1, "lelo"), c2(2, "tobias");
clout.push_back(c1);
clout.push_back(c2); 
ofstream o("savefile.txt");	
writeToFile(clout, o);
o.close();
ifstream i("savefile.txt");
readFromFile(clin, i);
int numCliente = clin[0].getNumero();
return 0;

}

Assim está a dar-me erro... Ou será que esta notação de array não pode ser usada no main?

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sorry, confundi com vector.

Não existe acesso aleatório na list, só sequencial. Tens que utilizar iteradores e incrementar até ao objecto pretendido:

	for (list<Cliente>::iterator it = clin.begin(); it != clin.end(); ++it) {
	cout << "Nome: " << it->getNome() << "\nNumero: " << it->getNumero() << endl;

}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

No problem! Ainda pagava-te o fino na mesma  :thumbsup:

Os vectores são mais faceis de implementar que as listas?

Mais uma vez, Muito Obrigado! ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ora... em termos de implementação as listas são um pouco mais complicadas, sim.

Em termos de uso, depende do que precisas. Os vectores demoram mais a inserir elementos no meio, mas são mais rápidos a aceder a elementos aleatórios. As listas por outro lado são mais rápidas a inserir elementos, mas só permitem o acesso sequencial, o que dificulta o acesso.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora