2012-02-10 19 views
6

Ho una funzione in cui sto passando un iteratore a un buffer char * (che è anche un carattere *). La funzione deve incrementare l'iteratore. In ogni caso, ho scoperto che un buon metodo di passsing l'iteratore nella funzione è passando il puntatore di riferimento:passando un puntatore per riferimento in C++

bool myFunction(unsigned char * &iter) 
{ 
    ... 

Tuttavia, ho sentito dire che questa è la cattiva forma e potrebbe causare problemi. Ecco il metodo suggerito dal mio collega:

typedef unsigned char * unsignedcharptr; 
bool myFunction(unsignedcharptr &iter) 
{ 
    ... 

Mi sembra che entrambi stiano facendo la stessa cosa. C'è una differenza di compilatore tra questi due metodi (sto usando Visual Studio 2005)? Che è corretto?

+4

avrei preferito prendere in considerazione typedef per i tipi di puntatore forma difettosa a causare problemi, ma bene, per il compilatore là isn non c'è differenza. –

+0

perché non restituire una distanza da incrementare invece di modificare il puntatore? – Anycorn

+1

Semanticamente non vi è alcuna differenza, ma sì, la seconda è in gran parte preferita, i dattilografi sono facili da leggere. –

risposta

7

Non penso ci sia alcuna differenza tra i due. Dovresti chiedere al tuo collega perché crede che ci sia.

Cosa potrebbe essere la causa è per la manutenibilità, dove se si voleva cambiare unsigned char *-char * dovresti solo cambiare un posto. Ma questo, penso, potrebbe portare ad altri problemi.

+0

la differenza tra i due potrebbe essere la leggibilità – Adrian

+3

@Adrian che è soggettiva però. Trovo che 'unsigned char *' più leggibile di 'unsignedintptr', mentre alcuni commenti suggeriscono altrimenti. Cosa ne pensi? –

+0

Nah, non si trattava di leggibilità. Penso che lei pensi che causerebbe problemi di memoria. –

5

C'è una differenza di compilatore tra questi due metodi (sto utilizzando Visual Studio 2005)?

Come altri hanno correttamente notato, "no".

Quale è corretto?

Tra le due alternative, tutto si riduce al dibattito "dovrei nascondere i puntatori dietro a typedef". Esistono argomenti validi per entrambe le posizioni

Tuttavia, penso che entrambi i frammenti di codice soffrano di eccessiva specializzazione. Preferisco codificare gli algoritmi come funzioni modello in modo che I Don't Repeat Myself.

Se il progetto lo supporta, si potrebbe generalizzare il codice per accettare qualsiasi iteratore:

template <class InputIterator> 
bool myFunction(InputIterator &iter) 
{ 
    std::cout << *iter; 
    ++iter; 
    return true; 
} 
+1

Quindi, qual è la versione migliore rispetto all'altra? –

Problemi correlati