PDA

Visualizza la versione completa : C++ e OOP


keratox
13-07-2004, 12:13
Ho iniziato a leggermi il libro di Stroustrup sul C++ e devo dire che è abbastanza complesso.
Ho provato ora a formulare un programma per vedere cio' che avevo imparato. Ho provato ad utilizzare le liste.
Solamente che ho davvero molti molti dubbi.
Prima di tutto, pero', vi mostro cio' che ho scritto:



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

using namespace std;

class player{
public:

list<string,string> p;
string nome_ ;
string ruolo_;

void add(nome_& n, ruolo_& r){
p.push_back(n,r);
}

void find(nome_& n, ruolo_& r){
typedef list<string,string>::const_iterator LI;
LI i = p.begin();
while(i<p.end()){
++i;
nome& nm = *i;
ruolo& rl = *1:
if(nm==n || rl==r || (rl==r && nm==n)){
cout<<"Nome: " << n << "\tRuolo: " << r << "\n";
}
}
}
};


Diciamo che non si puo' definire un vero e proprio fiasco, siccome solamente ( :dottò: ) 2 errori sono usciti ( che personalmente non capisco ):

D:\Documents and Settings\home\Documenti\Roby\MyApp\giocatori.cpp(1 4) : error C2061: syntax error : identifier 'nome_'
D:\Documents and Settings\home\Documenti\Roby\MyApp\giocatori.cpp(1 8) : error C2061: syntax error : identifier 'nome_'


Premetto anche che se do' a nome_ e a ruolo_ un risultato, vengono fuori 6 errori.

Comunque adesso esplico i miei dubbi:

1) Ho salvato quel file in giocatori.cpp . E' corretto???
2) Dovrei creare un file tipo giocatori.h con solamente la definizione dei metodi? come..


class player{
public:
list<string,string> p;
string nome_ ;
string ruolo_;

void add(nome_& n, ruolo_& r);
void find(nome_& n, ruolo_& r);
};


3) anche per programmi ad oggetti è necessario un main() ?? questo main() va in un file separato dalla struttura della classe ??

Probabilmente mi sono scordato qualche domanda, probabilmente ve ne chiedero' qualcuna, a meno che non mi bastino le vostre risposte.

Ciao :fagiano:

keratox
13-07-2004, 13:24
un errore stava qui



ruolo& rl = *1; // c'era un :


solo che persistono gli errori

D:\Documents and Settings\home\Documenti\Roby\MyApp\giocatori.cpp(1 4) : error C2061: syntax error : identifier 'nome_'
D:\Documents and Settings\home\Documenti\Roby\MyApp\giocatori.cpp(1 8) : error C2061: syntax error : identifier 'nome_'


mmmh...

geiar99
13-07-2004, 15:30
Ti dico subito che per la programmazione oop è sempre necessario un main. Altrimenti queste funzioni non vengono eseguite. Non è necessario che il main() sia in un foglio separato, anche se è buona norma. POtresti suddividere il programma in un header che contenga solo la definizione della classe e dei suoi metodi, ma solo per correttezza formale: funziona tutto comunque. Il file giocatori.cpp va benissimo.

geiar99
13-07-2004, 15:43
Ma il codice era sul libro? MI sembra che ci siano parecchi errori (magari sbaglio). Per esempio l'erroe che ti dà accade perchè con

nome_& n, ruolo_& r

vai a definire due puntatori di tipo nome_ e ruolo_ quando non sono dei tipi di dati, ma solo delle stringhe, dato che hai scritto string nome_ e string ruolo_ .
Poi non hai definito n e r: sono dei puntatori? Allora aggiungi nella classe
string *n, *p;

Magari puoi iniziare correggendo così. (magari ho sbagliato l'interpretazione del tuo programma).
:ciauz:

keratox
13-07-2004, 16:46
Grazie dei consigli!

Il codice non era nel libro, ho usato i (tanti) listati per prendere spunti.

cmq così




void add(string* n,r){
p.push_back(n,r);
}

void find(string* n,r){
....


mi restituisce gli errori

D:\Documents and Settings\home\Documenti\Roby\MyApp\giocatori.cpp(1 4) : error C2061: syntax error : identifier 'r'
D:\Documents and Settings\home\Documenti\Roby\MyApp\giocatori.cpp(1 8) : error C2061: syntax error : identifier 'r'

geiar99
13-07-2004, 17:20
Non
void add(string* n,r)
ma
void add(string *n, string *r) oppure void add(string* n, string* r)

E così di seguito.
La
p.push_back(n,r);
mi sembra che accetti solo una variabile come input, non due, quindi devi decidere quale passargli.
Ciao
:)

keratox
13-07-2004, 17:48
avevo provato con

add(string* n, string* r)

ma poi saltavano fuori tantissimi errori..(come nel codice seguente)

come mai qua mi restituisce 19 errori ???



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

using namespace std;

class player{
public:

list<string> p;

void add(string* n){
p.push_back(n);
}

int find(string* n){
typedef list<string>::const_iterator LI;
LI i = p.begin();
while(i<p.end()){
++i;
nome& nm = *i;
if(nm==n){
cout<<n<<" presente nella lista\n";
return 1;
}
}
return 0;
}

int main(){
player pl;
string name;
cout << "Nome da aggiungere: ";
cin >> name;
pl.add(name);
int thereis = pl.find(name);
if(thereis==1){
cout<< "Occorrenza aggiunta correttamente";
}
else{
cout<< "Occorrenza non aggiunta";
}
return 0;
}
};


:incupito:

geiar99
13-07-2004, 23:57
Allora, non è che adesso ci siano più errori, è solo che il compilatore ora te li mostra tutti, mentre prima non andava avanti nel controllo, a causa di due erroi gravi.
Il punto è questo: non credo che il codice sia corretto. Togliamo
int
da
main , che tanto nons erve e lasciamo solo
void main() {
Ora è tardi, domani ridò un'occhiata a tutto il codice. Però la funzione push non va in questo modo.
Ciao

toraz
14-07-2004, 00:26
se posso... ho dato un'occhiata veloce al codice e mi sono reso conto che main e' un membro della classe... la cosa decisamente non funziona (non so che compilatore usi ma il linker dovrebbe tirarti fuori un errore del tipo "undefined reference to 'main'"... quantomeno ld ritorna questo errore)... quindi devi tirare fuori main dalla classe


#include <...>

class player
{
public:
// i membri pubblici
// ...

private:
// i membri privati
// ...
};

int main()
{
// il codice che usa la classe player
// ...
}


altri errori cosi' su due piedi non ne ho visti... potrebbe essere che ce ne siano altri... ma se correggi quello del main dovresti iniziare a venire a capo della situazione.

aggiungo un altra cosa... main lascialo int... se ci metti void verosimilmente qualunque compilatore che non sia visualc++ (almeno di quelli che mi e' capitato di usare... che poi sono tutti derivati di gcc...) ti fa una leva e non gli passa nemmeno per l'anticamera del cervello di compilare... mi pare che sul libro di strostrup ci sia un intero paragrafo riguardo alla faccenda :)

keratox
14-07-2004, 07:50
OK ho fatto così ma questo



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

using namespace std;

class player{
public:

list<string> p;
string nome_ ;
string ruolo_;

void add(string* n){
p.push_back(n);
}

int find(string* n){
int i = p.begin();
while(i<p.end()){
++i;
nome& nm = *i;
if(nm==n){
cout<<n<<" presente nella lista\n";
return 1;
}
}
return 0;
}
};


int main(){
player pl;
pl.add("Topo Gigio");
int thereis = pl.find("Topo Gigio");
if(thereis==1){
cout<< "Occorrenza trovata";
}
else{
cout<< "Occorrenza non trovata";
}
return 0;
}



mi dà questi 10 errori


D:\Documents and Settings\home\Documenti\Roby\MyApp\giocatori.cpp(1 5) : error C2664: 'push_back' : cannot convert parameter 1 from 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > *' to 'const class std::basic
_string<char,struct std::char_traits<char>,class std::allocator<char> > &'
Reason: cannot convert from 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > *' to 'const class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >'
No constructor could take the source type, or constructor overload resolution was ambiguous

D:\Documents and Settings\home\Documenti\Roby\MyApp\giocatori.cpp(1 9) : error C2440: 'initializing' : cannot convert from 'class std::list<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::allocator<c
lass std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > >::iterator' to 'int'
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

D:\Documents and Settings\home\Documenti\Roby\MyApp\giocatori.cpp(2 0) : error C2784: 'bool __cdecl std::operator <(const class std::basic_string<_E,_Tr,_A> &,const _E *)' : could not deduce template argument for 'const class std::basic_string<_E,_Tr
,_A> &' from 'int'

D:\Documents and Settings\home\Documenti\Roby\MyApp\giocatori.cpp(2 0) : error C2784: 'bool __cdecl std::operator <(const _E *,const class std::basic_string<_E,_Tr,_A> &)' : could not deduce template argument for 'const *' from 'int'

D:\Documents and Settings\home\Documenti\Roby\MyApp\giocatori.cpp(2 0) : error C2784: 'bool __cdecl std::operator <(const class std::basic_string<_E,_Tr,_A> &,const class std::basic_string<_E,_Tr,_A> &)' : could not deduce template argument for 'cons
t class std::basic_string<_E,_Tr,_A> &' from 'int'

D:\Documents and Settings\home\Documenti\Roby\MyApp\giocatori.cpp(2 0) : error C2784: 'bool __cdecl std::operator <(const class std::list<_Ty,_A> &,const class std::list<_Ty,_A> &)' : could not deduce template argument for 'const class std::list<_Ty,
_A> &' from 'int'

D:\Documents and Settings\home\Documenti\Roby\MyApp\giocatori.cpp(2 0) : error C2784: 'bool __cdecl std::operator <(const class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> &,const class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> &)' : could not deduce t
emplate argument for 'const class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> &' from 'int'

D:\Documents and Settings\home\Documenti\Roby\MyApp\giocatori.cpp(2 0) : error C2784: 'bool __cdecl std::operator <(const struct std::pair<_T1,_T2> &,const struct std::pair<_T1,_T2> &)' : could not deduce template argument for 'const struct std::pair
<_T1,_T2> &' from 'int'

D:\Documents and Settings\home\Documenti\Roby\MyApp\giocatori.cpp(2 0) : error C2677: binary '<' : no global operator defined which takes type 'class std::list<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,cl
ass std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > >::iterator' (or there is no acceptable conversion)

D:\Documents and Settings\home\Documenti\Roby\MyApp\giocatori.cpp(2 0) : fatal error C1903: unable to recover from previous error(s); stopping compilation

Loading