Newsgroup: it.comp.lang.c++
Titolo: C++ WARNING

Nessuno di voi saprebbe fornirmi qualche spiegazione sul seguente
warning :
warning : taking adress of temporary
Esso e' generato dal compilatore GCC (ver. 2.96) quando chiamo dei
metodi di una classe madre da una classe figlia (che dovrebbe
ereditare senza problemi...) una cosa del tipo:
class Oggetto {
	public:
		void metodo1();
};
class Madre{
	public :
		Oggetto *metodo2();
};
class Figlia : public Madre{
	public :
		void metodo3() {
			metodo2()->metodo1();//warning
		};
};
Grazie!

 };
Dunque, probabilmente potrei sbagliarmi, non mi è mai capitato, anzi ora ho
compilatocon il DJGPP 2.95 e non mi da nessun warning, ma a giudicare da
quanto dice il messaggio di warning, credo che avvenga una cosa simile:
Quando fai
metodo2() -> metodo1()
metodo2() restituisce un puntatore ad un oggetto... tramite esso chiami
metodo1() ma l'oggetto chiamante, si perde, visto che è un valore restituito
dal metodo e non è assegnato a niente.... se fai una cosa simile:
Oggetto* obj = metodo2();
obj -> metodo1();
Il warning non te lo dovrebbe dare forse, e se te lo da, esso potrebbe
essere legato al fatto che cmq "obj" è locale e quindi temporaneo pure
(anche gli oggetti locali sono temporanei no?)
Ciao
--
Luigi

 ereditare senza problemi...) una cosa del tipo:
Potresti mostrare il codice reale o una sua variante semplificata e
compilabile che produca il medesimo warning?
Max


Grazie!
Ciao

Ma secondo voi vale la pena di creare tutta una serie di puntatori a
oggetto locali per non ottenere piů il warning o me ne frego, nel
senso il fatto di usare puntatori locali comporta qualcosa di
particolare?
Grazie a tutti.

 particolare?
Secondo me il problema non e' tanto quello del warning in se, quanto il
fatto che apparentemente non controlli mai se i puntatori restituiti
sono validi. In
a()->b();
Se a() restituisce 0 sei morto.
Ciao,
Nicola

 ereditare senza problemi...) una cosa del tipo:
ti stai sbagliando: ho provato a compilare il codice da te postato con 
gcc 2.96 e non da (ovviamente) alcun warning.
Dovresti postare del codice (un esempio il piu` piccolo possibile) che 
produce *effettivamente* il warning.
ciao Anto
-- 
Antonio Cuni, 19 anni, studente
Brainbench C++ Master: 4.73, higher than 99% of all previous test takers.
C Language: 3.79, higher than 92% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it

 particolare?
se il compilatore emette un warning la maggior parte delle volte ha 
ragione e tu dovresti trovare la causa reale. Cercare di "aggirare" il 
warning non e` molto d'aiuto.
Ipotesi: non e` che scrivi qualcosa del tipo:
class X {};
X* f()
{
  return &X();
}
se e` cosi` allora il compilatore ha pienamente ragione e il tuo codice 
e` sbagliato: infatti l'oggetto temporaneo creato dall'espressione X() 
viene distrutto subito dopo l'istruzione return e la funzione 
restituisce quindi l'indirizzo di un oggetto inesistente.


restituisce quindi l'indirizzo di un oggetto inesistente.
No, non scrivo nulla del genere ma :
class X{
 private:
  Oggetto *o;
 public:
  Oggetto *getOggetto(){
   return o;
  };
}
Secondo i principi della buona programmazione :) .


 Secondo i principi della buona programmazione :) .
e` vero, quello che scrivi e` corretto.
Perche` non provi a separare la dichiarazione dalla definizione e 
guardare in quale punto esatto ti da` il warning (definizione, return 
statement, punto di chiamata)?
