PDA

View Full Version : [C++] mi aspettavo un errore..e invece... [arg. puntatori a oggetti]


mapomapo
16-07-2007, 09:52
Salve ragazzi...
allora, partiamo con ordine: sto lavorando ad un progetto in c++ per l'esame di fondamenti di informatica 2, il tema d'anno è la "gestione di un cinema multisala".
Ho pensato a vari livelli di accesso, fatto tutte le varie classi, definito i metodi ecc...
ora, la cosa "strana" che mi è capitata è la seguente:
Ho una class amministratore con delle funzioni membro dichiarate...dato che il progetto serve a far vedere di saper fare quante più cose possibile ho deciso, quando si viene autenticati come administrator, di accedere alle funzioni secondo la seguente logica:
-il puntatore ad "amministratore" precedentemente dichiarato viene utilizzato per una chiamata alla new (admin = new amministratore; )
-accedo alle funzioni a run time (admin->funzione_membro());
-libero la memoria con "delete admin;"

La cosa strana è questa: se lascio dichiarato solo il puntatore all'inizio del main (amministratore *admin; ) e provo a chiamare una funzione membro come sopra funziona!!!!
io mi aspettavo qualcosa di differente come un errore di qualche tipo...ora mi chiedo:
-è capitato anche a voi??
-può essere una "agevolazione" del visual c++ 6.0 ? (nel senso che non appena vede la dichiarazione di un puntatore istanzia subito un oggetto e lo fa puntare?)

Grazie mille per l'attenzione,

Vito

cionci
16-07-2007, 10:24
Funziona ma ti dovrebbe andare in crash, se non subito, dopo poche chiamate.

tomminno
16-07-2007, 14:00
In realtà dovrebbe crashare subito anche perchè non essendo inizializzato quel puntatore vale 0x0c0c0c0c, ci deve essere un altro motivo.
Difficile che nell'enorme elenco di bachi di VC6 ci sia una cosa simile.

LetBloodline
18-07-2007, 08:49
In realtà una classe può anche essere usata unicamente per contenere altri metodi non necessitando quindi di una innizializzazione formale. Finchè usi metodi che non facciano riferimento a variabili di classe il programma funziona senza inizializzazione

Difatti viene dato un Warning se si usa una puntatore ad una classe non inizializzata, non un errore
warning C4700: local variable 'a' used without having been initializedproprio perchè se i metodi richiamati non vanno a leggere e/o modificare variabili di classe funziona tutto

Torav
18-07-2007, 10:05
ma in questo caso le funzioni non dovrebbero essere definite static? non pensavo che anche senza essere static potessero essere richiamate :mc:

LetBloodline
19-07-2007, 07:35
ma in questo caso le funzioni non dovrebbero essere definite static? non pensavo che anche senza essere static potessero essere richiamate :mc:

class PROVA
{
public:
int id(int);
int ide(int);
int e;
};


int PROVA::id(int a){
return(a);
}


int PROVA::ide(int a){
e = a;
return(a);
}e poi nel corpo del programma:
PROVA *a;
Warning (a->id(5));
Warning è una procedura personalizzata per stampare in una finestra

Così funziona senza darmi problemi se richiamo id, ma se richiamo ide allora dà errore

Ufo13
19-07-2007, 08:40
ma in questo caso le funzioni non dovrebbero essere definite static? non pensavo che anche senza essere static potessero essere richiamate :mc:

Sta tranquillo che non la troveresti nella sezione: C++ - Best Practices =P

71104
19-07-2007, 15:02
class PROVA
{
public:
int id(int);
int ide(int);
int e;
};


int PROVA::id(int a){
return(a);
}


int PROVA::ide(int a){
e = a;
return(a);
}e poi nel corpo del programma:
PROVA *a;
Warning (a->id(5));
Warning è una procedura personalizzata per stampare in una finestra

Così funziona senza darmi problemi se richiamo id, ma se richiamo ide allora dà errore è normale; vedila così:

class PROVA
{
public:
int e;
};


int id(PROVA *this, int a){
return(a);
}


int ide(PROVA *this, int a){
this->e = a;
return(a);
}

e poi nel corpo del programma:

Warning (id(NULL, 5)); // ok
Warning (ide(NULL, 5)); // errore