2013-09-26 14 views
16

C'è un modo per "convertire" un riferimento a puntatore in C++? Nell'esempio qui di seguito, func ha già definito prototipo e non posso cambiarlo, ma è il mio func API, e mi piacerebbe passare uno o entrambi i parametri, uno (e secondo set per NULL) o nessuno dei due (entrambi impostato su NULL):convertito riferimento alla rappresentazione puntatore in C++

void func2(some1 *p1, some2 *p2); 

func(some1& obj, some2& obj2) 
{ 
    func2(..); 
} 
+5

"&", come per i non riferimenti. Come in 'func2 (& obj, & obj2)' – JoshG79

+2

Puoi prendere l'indirizzo di un riferimento. Ti dà l'indirizzo dell'oggetto designato. Cioè puoi fare 'func2 (& obj1, NULL)'. Nota che non c'è modo di passare 'NULL' a' func'; non esiste un riferimento 'NULL'. – BoBTFish

+0

@BoBTFish, i riferimenti NULL sono facili da creare. 'int * pi = 0; int & ri = π '. Certo che è cattivo, ma non impossibile e a volte fatto per caso. – Ben

risposta

21

func2(&obj, &obj2);

parametri di riferimento Usa come variabili normali.

6

Basta avere l'indirizzo dell'oggetto.

some1 *p = &obj; 

o nel vostro caso:

func2(&obj, &obj2); 
+0

Bene, vedo cosa stai cercando di fare, ma 'some1 & obj;' è sbagliato. Non è possibile creare un riferimento che non faccia riferimento a nulla. – rabensky

+0

Inoltre, questo non prende l'indirizzo del riferimento, ma l'indirizzo di ciò a cui si riferisce. I riferimenti non hanno indirizzi perché non è specificato se i riferimenti richiedono o meno la memorizzazione. – bstamour

+0

Scusa, non intendeva essere una dichiarazione. Ho appena copiato come la variabile è stata dichiarata nel codice dell'OP. –

3
func2(&obj, &obj2); 

è ciò che si dovrebbe usare.

1

Per un design pulito mettere tutto in una classe (o usare i namespace)

class X { 
    private: 
    void func2(someA*, someB*); 

    public: 
    func(someA& a, someB& b) { func2(&a, &b); } 
    func(someA& a) { func2(&a, 0); } 
    func() { func2(0, 0); } 
} 
Problemi correlati