PDA

View Full Version : [C++] alcune domande sulle list


luxorl
21-06-2009, 16:59
Ciao a tutti,
ho il mio bell'oggetto file_fs creato con una classe

class file_fs{ ... }

In un'altra classe mi sono costruito una lista di questi oggetti

list<file_fs> archivio;

Ora dovrei implementare un metodo che dato un determinato file_fs lo cerca nella lista e lo cancella.

Avevo pensato a qualcosa del genere:

void repository::unregister_file(file_fs x)
{
if(archivio.empty()){
sys_warn("Archivio Vuoto");
return;
}

list<file_fs>::iterator it;

for(it=archivio.begin(); it != archivio.end(); it++){
file_fs y = it.????;
if(y.equals(x)) it = archivio.erase(it);
}

}

Però con cosa mi prendo il valore a cui punta it?

NB: equals(file_fs x) è un metodo che mi sono implementato io nella classe file_fs ed è il seguente:

bool file_fs::equals(file_fs x)
{
string nf = x.get_file_name();
string ip = x.get_fs_ip();
int port = x.get_fs_port();

if((nome_file.compare(nf) == 0) && (fs_ip.compare(ip) == 0) && (fs_port == port)) return true;
else return false;
}

In pratica fa il confronto attributo per attributo dell'oggetto e ritorna true solo se tutti sono uguali.

E se volessi usare il metodo remove() di <list> che rimuove dalla lista un oggetto con un determinato valore?

In Java avrei dovuto implementare Comparable e ridefinire il metodo compareTo()... qui come si fa?

Don[ITA]
21-06-2009, 17:30
Usa remove (http://www.cplusplus.com/reference/stl/list/remove/) di list. :)

luxorl
21-06-2009, 17:34
Questa soluzione è corretta?

for(it=archivio.begin(); it != archivio.end(); it++){
if ((*it).equals(x)) archivio.erase(it);
}

luxorl
21-06-2009, 17:35
;27933576']Usa remove (http://www.cplusplus.com/reference/stl/list/remove/) di list. :)

Ma come fa a funzionare con un oggetto creato da me? :confused:

luxorl
21-06-2009, 18:08
Altra domandina :)
Per un metodo che deve cercare un oggetto file_fs sulla lista e ritornarlo avevo pensato di fare:

file_fs repository::get_file_fs(string nomefile)
{
//controllo che l'archivio non sia vuoto
if(archivio.empty()){
sys_warn("Archivio Vuoto");
return NULL;
}

list<file_fs>::iterator it;

for(it=archivio.begin(); it != archivio.end(); it++){
file_fs y = (*it);
if(y.get_file_name().compare(nomefile) == 0)
return y;
}

return NULL;

}

Solo che il compilatore si arrabbia perché evidentemente non è corretto ritornare NULL se l'oggetto non c'è....

strutture/repository.cpp: In member function ‘file_fs repository::get_file_fs(std::string)’:
strutture/repository.cpp:44: error: conversion from ‘int’ to non-scalar type ‘file_fs’ requested
strutture/repository.cpp:55: error: conversion from ‘int’ to non-scalar type ‘file_fs’ requested


Come risolvo?

Don[ITA]
21-06-2009, 21:41
Cosi su due piedi nn ricordo come funziona remove su oggetti creati da te. Volendo puoi usare remove_if (http://www.cplusplus.com/reference/stl/list/remove_if/) passando un opportuno operatore di confronto.
Per quanto riguarda il get fatto da te è concettualmente errato. Da quel che leggo sembri essere ancora troppo legato alla programmazione java. Un get fatto cosi ti ritorna un istanza di file_fs vera e propria. Per quello che il compilatore si arrabbia. NULL (o anche 0) non è compatibile con file_fs. Per correggerlo basta che gli fai tornare un reference o un puntatore.

Ovviamente spero di nn aver scritto vaccate immani e confido che qualcuno molto più saggio di me passi a dare un occhio :D

Saluti

luxorl
22-06-2009, 12:10
;27936172']Cosi su due piedi nn ricordo come funziona remove su oggetti creati da te. Volendo puoi usare remove_if (http://www.cplusplus.com/reference/stl/list/remove_if/) passando un opportuno operatore di confronto.
Per quanto riguarda il get fatto da te è concettualmente errato. Da quel che leggo sembri essere ancora troppo legato alla programmazione java. Un get fatto cosi ti ritorna un istanza di file_fs vera e propria. Per quello che il compilatore si arrabbia. NULL (o anche 0) non è compatibile con file_fs. Per correggerlo basta che gli fai tornare un reference o un puntatore.

Ovviamente spero di nn aver scritto vaccate immani e confido che qualcuno molto più saggio di me passi a dare un occhio :D

Saluti


Ho studiato un po' :D e ho stilato questa soluzione:

file_fs* repository::get_file_fs(string nomefile)
{
//controllo che l'archivio non sia vuoto
if(archivio.empty()){
sys_warn("Archivio Vuoto");
return NULL;
}

list<file_fs>::iterator it;

for(it=archivio.begin(); it != archivio.end(); it++){
if((*it).get_file_name().compare(nomefile) == 0)
return &(*it);
}

return NULL;

}

Il compilatore è felice.
Ora è giusto?