Puntatore a puntatore

di il
4 risposte

Puntatore a puntatore

Ciao a tutti!

Immaginiamo di avere questa situazione:

class A
{
    void metodo_A (tipoA* x, tipoA* y, tipoA* z);
};
     
class B : public class A
{
    void metodo_B ();
};
Classe B è sottoclasse di A ed entrambe definiscono un certo "metodo_".

In particolare, il corpo di metodo_B è questo:

void class B::metodo_B ()
{
    tipoB* x, y, z;
    x=NULL;
    y=NULL;
    z=NULL;

    class A::metodo_A (cast2tipo_A (*x), cast2tipo_A (*y), cast2tipo_A (*z));
    // esegui altre operazioni su x, y e z
}
In parole povere, in metodo_B ci sono tre puntatori x, y e z dello stesso tipo della classe che vengono castati al tipo della superclasse all'atto della chiamata di metodo_A. Fin qui, tutto ok. Il problema nasce nel momento in cui i tre puntatori vengono modificati nel corpo di metodo_A. Ho bisogno, in pratica, di farmi restituire i nuovi valori dei puntatori. Ho pensato, così, di utilizzare dei puntatori a puntatori. I codici diventano:

class A
{
    void metodo_A (tipoA** x, tipoA** y, tipoA** z);
};

class B : public class A
{
    void metodo_B ();
};
...e...

void class B::metodo_B ()
{
    tipoB* x, y, z;
    x=NULL;
    y=NULL;
    z=NULL;

    class A::metodo_A (cast2tipo_A** (&x), cast2tipo_A** (&y), cast2tipo_A** (&z));
    // esegui altre operazioni su x, y e z
}
Il compilatore mi da errore nel caso usassi lo static_cast, suggerendomi di usare il reinterpret_cast che, però, non credo sia la scelta più elegante, seppur funzionante.

Avete dei suggerimenti alternativi da darmi?

Grazie in anticipo!

4 Risposte

  • Re: Puntatore a puntatore

    Ciao MagoAntò
    scusa se faccio il pignolo, ma tu volevi scrivere in questo modo?:
    
    void metodo_A (A* x, A* y, A* z);
    ...
    B* x, y, z;
        x=NULL;
        y=NULL;
        z=NULL;
    
    perchè altrimenti non capisco.
  • Re: Puntatore a puntatore

    Ehm...si...
  • Re: Puntatore a puntatore

    Ciao MagoAntò,

    Se B deriva da A, B può essere usato come se fosse un A, non serve nessun cast.
    Dato che un Gatto è un Animale puoi passare un Gatto ad una funzione che opera su un Animale.
    
    class A
    {
    public:
            void MyFunc(A* a) 
    	{
                //...
    	}
    };
    
    class B: public A
    {
    	void MethodB() 
    	{ 
    		B* b = NULL;
    		MyFunc(b);  // tutto OK
    	}
    };
    
    Diverso è il problema se la funzione deve modificare il puntatore. In questo caso personalmente trovo più chiaro passare un puntatore per indirizzo (i doppi puntatori mi hanno fatto sempre venire la pelle d' oca ).
    
    class A
    {
    public:
            virtual ~A() {}
    
            void MyFunc(A*& a) 
            {
                 // ...
            }
    };
    
    Il distruttore virtuale l' ho aggiunto solo perchè dopo useremo il dynamic_cast (che non funziona se la classe non è polimorfa, ovvero se non ha almeno un metodo virtuale).

    Il metodo MyFunc mi pare più chiaro cosi, riceve un puntatore per riferimento, cioè intende cambiarlo.
    Pero ora non lo puoi richiamare passandogli un B*, deve per forza essere un A*.

    Puoi fare in questo modo:
    
    class B: public A
    {
    	void MethodB() 
    	{ 
    		B* b = NULL;
    
    		A* temp = b;
    		MyFunc(temp);  
    		b = dynamic_cast<B*> (temp);
    	}
    };
    
  • Re: Puntatore a puntatore

    Grazie mille, sempre preciso e puntuale (e siamo a 2... )
Devi accedere o registrarti per scrivere nel forum
4 risposte