PDA

View Full Version : [C++] OOP, non mi riconosce gli oggetti


Tizio90
11-04-2009, 09:45
Salve a tutti ragazzi, avrei un esercizio da fare per le vacanze.

Praticamente è da scrivere un programma in C++ che sia in grado di gestire un magazzino, facendo uso delle liste (quindi sia dichiarazione di un classe Nodo, e di una classe Lista). Il problema è che, in base a come faccio gli include dei due file *.h mi da errori diversi. Vi posto il codice che ho scritto fino ad adesso.

Classe Nodo
#ifndef _NODO_H
#define _NODO_H
#define DMAX 20

class Nodo{
private:
char articolo[DMAX];
int quantita;
Nodo *next;
public:
Nodo(char [], int, Nodo *);
char *getArticolo();
int getQuantita();
Nodo *getNext();
void setArticolo(char []);
void setQuantita(int);
void setNext(Nodo *);
};

#endif /* _NODO_H */



Classe Lista

#ifndef _LISTA_H
#define _LISTA_H

class Lista{
private:
Nodo *testa;
public:
Lista();
~Lista();
bool inserisci(char [], int);
bool elimina(char []);
bool ricercaArticolo(char []);
void visualizza();
friend Lista fusione(Lista, Lista);
};

#endif /* _LISTA_H */



Metodi Nodo
#include "Nodo.h"
#include <iostream>

using namespace std;

Nodo::Nodo(char x[], int q, Nodo *p){
strcpy(articolo, x);
quantita=q;
next=p;
}

char *Nodo::getArticolo(){
return articolo;
}

Nodo *Nodo::getNext(){
return next;
}

int Nodo::getQuantita(){
return quantita;
}

void Nodo::setArticolo(char x[]){
strcpy(articolo, x);
}

void Nodo::setQuantita(int q){
quantita=q;
}

void Nodo::setNext(Nodo *n){
next=n;
}


Metodi Lista
#include "Lista.h"
#include "Nodo.h"
#include <iostream>

using namespace std;

Lista::Lista(){
testa=new Nodo('\0', 0, NULL);
}

Lista::~Lista(){

}

void Lista::visualizza(){
Nodo *temp = testa;
if(testa == NULL){
cout << "\nLa lista e' vuota...\n\n";
}
else{
while(temp != NULL){
cout << "Nome dell' articolo:\t" << temp -> getArticolo() << endl;
cout << "Quantita' articolo:\t" << temp -> getQuantita() << endl;
temp = temp -> getNext();
}
cout << endl;
}
}

bool Lista::elimina(char x[]){
Nodo *temp;
Nodo *precedente;
bool trovato;
if(testa == NULL){
cout << "\nLista vuota.\n\n";
}
else{
trovato = false;
precedente = NULL;
temp = testa;
if(strcmp(testa -> getArticolo(),x) == 0){
testa = testa -> getNext();
delete temp;
trovato = true;
}
else{
while((trovato == false) && (temp != NULL)){
if(strcmp(temp -> getArticolo(),x) == 0){
trovato = true;
precedente ->setNext(temp -> getNext());
delete temp;
}
else{
precedente = temp;
temp = temp -> getNext();
}
}
if(trovato == false)
cout << "\nElemento non presente nella lista.\n\n";
cout << "\nEliminazione avvenuta con successo.\n\n";
}
}
}

bool Lista::inserisci(char x[], int q){
Nodo *nuovo;
Nodo *temp;
Nodo *precedente;
nuovo -> setArticolo(x);
nuovo ->setQuantita(q);
nuovo ->setNext(NULL);
if(testa == NULL){
testa = new Nodo(x, q, NULL);
}
else{
if(strcmp(testa -> getArticolo(),nuovo -> getArticolo()) > 0){
temp = testa;
testa = nuovo;
testa -> setNext(temp);
}
else{
temp = testa;
while((temp != NULL) && (strcmp(nuovo -> getArticolo(),temp -> getArticolo())) > 0){
precedente = temp;
temp = temp -> getNext();
}
nuovo -> setNext(temp);
precedente -> setNext(nuovo);
}
}
}

bool Lista::ricercaArticolo(char x[]){
Nodo *temp;
Nodo *precedente;
bool trovato;
if(testa == NULL){
cout << "\nLista vuota.\n\n";
}
else{
trovato = false;
precedente = NULL;
temp = testa;
if(strcmp(testa -> getArticolo(),x) == 0){
testa = testa -> getNext();
delete temp;
trovato = true;
}
else{
while((trovato == false) && (temp != NULL)){
if(strcmp(temp -> getArticolo(),x) == 0){
trovato = true;
precedente -> setNext(temp -> getNext());
delete temp;
}
else{
precedente = temp;
temp = temp -> getNext();
}
}
if(trovato == false)
cout << "\nArticolo presente nella lista.\n\n";
cout << "\nEliminazione avvenuta con successo.\n\n";
}
}
}


Main
#include <iostream>
#include "Lista.h"
#include "Nodo.h"

using namespace std;
/*
*
*/
int main() {
char scelta;

char articolo;
int quantita;

bool test;

Lista mag_uno();
Lista mag_due();

mag_uno=new Lista();
mag_due=new Lista();

do{
cout<<"1. Carica articoli nel primo magazzino.\n";
cout<<"2. Carica articoli nel secondo magazzino.\n";
cout<<"3. Scarica articolo dal primo magazzino.\n";
cout<<"4. Scarica articolo dal secondo magazzino.\n";
cout<<"5. Visualizza articoli presenti nel primo magazzino.\n";
cout<<"6. Visualizza articoli presenti nel secondo magazzino.\n";
cout<<"7. Ricerca articolo nel primo magazzino.\n";
cout<<"8. Ricerca articolo nel secondo magazzino.\n";
cout<<"9. Fondi i due magazzini.\n";

cout<<"0. Uscita.\n\n";

cout<<"Inserisci la tua scelta: ";
cin>>scelta;

switch(scelta){
case '1':{
cout<<"Nome dell' articolo: ";
cin>>articolo;
cout<<"Quantita': ";
cin>>quantita;
test=mag_uno->inserisci(articolo, quantita);
}break;
case '2':{
cout<<"Nome dell' articolo: ";
cin>>articolo;
cout<<"Quantita': ";
cin>>quantita;
test=mag_due->inserisci(articolo, quantita);
}break;
case '3':{
cout<<"Nome articolo da eliminare: ";
cin>>articolo;
cout<<"Quantità da eliminare: ";
cin>>quantita;
test=mag_uno->elimina(articolo, quantita);
}break;
case '4':{
cout<<"Nome articolo da eliminare: ";
cin>>articolo;
cout<<"Quantità da eliminare: ";
cin>>quantita;
test=mag_due->elimina(articolo, quantita);
}break;
case '5':{
mag_uno->visualizza();
}break;
case '6':{
mag_due->visualizza();
}break;
case '7':{
cout<<"Nome articolo da ricercare: ";
cin>>articolo;
test=mag_uno->ricercaArticolo(articolo);
if(test==true)
cout<<"Elemento presente.\n";
cout<<"Elemento non presente.\n";
}break;
case '8':{
cout<<"Nome articolo da ricercare: ";
cin>>articolo;
test=mag_due->ricercaArticolo(articolo);
if(test==true)
cout<<"Elemento presente.\n";
cout<<"Elemento non presente.\n";
}break;
case '9':{
// Fusione delle liste.
}break;
case '0':{
scelta='u';
}break;
default:{
cout<<"Valore non consentito.\n";
system("PAUSE");
system("cls");
}break;
}
system("PAUSE");
system("cls");
}while(scelta!='u');

return (EXIT_SUCCESS);
}



Per scrivere, compilare ed eseguire il codice uso Netbeans 6.5.

BrutPitt
11-04-2009, 09:52
Se magari posti anche gli errori che ottieni dalla compilazione... cosi' ci si focalizza su quelli... senza dover scorrere tutto il codice, che non sono proprio 2 righe quelle che hai postato ... :D

Anche se nel file "classe lista"... c'andrebbe una dichiarazione...

class Nodo;

... prima della classe Lista ;)

Tizio90
11-04-2009, 23:25
Allora, se nell' implementazione dei metodi della classe Lista scrivo:

#include "Lista.h"
#include "Nodo.h"


Ma da i seguenti errori, riferiti a quel file:

In file included from metodiLista.cpp:1:
Lista.h:15: error: ISO C++ forbids declaration of `Nodo' with no type
Lista.h:15: error: expected `;' before '*' token
metodiLista.cpp: In constructor `Lista::Lista()':
metodiLista.cpp:8: error: `testa' undeclared (first use this function)
metodiLista.cpp:8: error: (Each undeclared identifier is reported only once for each function it appears in.)
metodiLista.cpp: In member function `void Lista::visualizza()':
metodiLista.cpp:16: error: `testa' undeclared (first use this function)
metodiLista.cpp: In member function `bool Lista::elimina(char*)':
metodiLista.cpp:34: error: `testa' undeclared (first use this function)
metodiLista.cpp: In member function `bool Lista::inserisci(char*, int)':
metodiLista.cpp:72: error: `testa' undeclared (first use this function)
metodiLista.cpp: In member function `bool Lista::ricercaArticolo(char*)':
metodiLista.cpp:97: error: `testa' undeclared (first use this function)
C:\Dev-Cpp\bin\make.exe: *** [build/Debug/Cygwin-Windows/metodiLista.o] Error 1


Se invece scrivo:

#include "Nodo.h"
#include "Lista.h"


Gli errori, in questo caso però riferiti al main, sono questi:


In file included from main.cpp:9:
Lista.h:15: error: ISO C++ forbids declaration of `Nodo' with no type
Lista.h:15: error: expected `;' before '*' token
main.cpp: In function `int main()':
main.cpp:27: error: assignment of function `Lista mag_uno()'
main.cpp:27: error: cannot convert `Lista*' to `Lista ()()' in assignment
main.cpp:28: error: assignment of function `Lista mag_due()'
main.cpp:28: error: cannot convert `Lista*' to `Lista ()()' in assignment
main.cpp:52: error: request for member `inserisci' in `mag_uno', which is of non-class type `Lista ()()'
main.cpp:59: error: request for member `inserisci' in `mag_due', which is of non-class type `Lista ()()'
main.cpp:66: error: request for member `elimina' in `mag_uno', which is of non-class type `Lista ()()'
main.cpp:73: error: request for member `elimina' in `mag_due', which is of non-class type `Lista ()()'
main.cpp:76: error: request for member `visualizza' in `mag_uno', which is of non-class type `Lista ()()'
main.cpp:79: error: request for member `visualizza' in `mag_due', which is of non-class type `Lista ()()'
main.cpp:84: error: request for member `ricercaArticolo' in `mag_uno', which is of non-class type `Lista ()()'
main.cpp:92: error: request for member `ricercaArticolo' in `mag_due', which is of non-class type `Lista ()()'
make.exe[2]: *** [build/Debug/Cygwin-Windows/main.o] Error 1


Buona Pasqua comunque! :D

tomminno
12-04-2009, 10:52
Devi includere Nodo.h in Lista.h non in Lista.cpp

BrutPitt
12-04-2009, 11:41
Nel primo gruppo di errori il problema e' la sequenza degli include

Nel secondo gruppo di errori... UN problema e' sicuramente qui:


Lista mag_uno();
Lista mag_due();

mag_uno=new Lista();
mag_due=new Lista();


prova:

Lista *mag_uno = new Lista;
Lista *mag_due = new Lista;

(per liberare la memoria... "delete")

O alternativamente basta solo:

Lista mag_uno;
Lista mag_due;

ma poi devi usare l'operatore "." al posto dell'operatore "->"



Per quanto riguarda gli include, invece, o metti la dichiarazione in list.h:

class Node;

e includi entrambi i .h nei files main.cpp e list.cpp
(come scrivevo... e a quel punto l'ordine non ha piu' importanza)


Oppure inserisci in list.h:
#include <node.h>

e includi solo list.h nei files main.cpp e list.cpp