PDA

View Full Version : [C++] problemino puntatori


Re_Kotc
12-07-2010, 15:45
ciao a tutti, sto cercando di passare un puntatore ad un array tramite una funzione in C++..ma sbaglio qualcosa perchè non funziona..

ho creato una classe diciamo A che contiene un array di oggetti di questo tipo:

Bumpcar *cars[6];

ho bisogno poi di creare una funzione che mi restituisca il puntatore all'array:

Bumpcar* GameListener::getCars(){




return cars ;
}

a questo punto un'altra classe B deve poter utilizzare questo metodo per ottenere le cars, allora in questa seconda classe ho un oggetto:

Bumpcar* bc[6];


e cerco di ottenere le cars così:

bc = oggettoclasseA->getCars();

ma mi restuisce l'errore:

error C2440: '=': impossibile convertire da 'Bumpcar *' a 'Bumpcar *[6]'

so che è un problema di come ho dichiarato le variabili..ma non riesco a trovare una soluzione...grazie

Albi89
12-07-2010, 16:02
Non puoi farlo perché un array introduce un puntatore costante, dunque non è possibile modificare l'indirizzo a cui punta (cosa che stai cercando di fare).

Una possibile soluzione è dichiarare bc come Bumpcar**, ma anche il tipo di ritorno di getCars() mi sembra sbagliato: dovrebbe essere anche lui Bumcpar**.

Re_Kotc
12-07-2010, 16:10
ti ringrazio della risposta ma ancora non funziona:
error C2440: 'return': impossibile convertire da 'Bumpcar *[6]' a 'Bumpcar *

cioè nella funzione getCars() non può ritornare il Bumpcar *[6] che mi serve..

Re_Kotc
12-07-2010, 16:11
che stupido non ho letto la seconda parte del tuo messaggio! ora provo a modificare tutto..

Re_Kotc
12-07-2010, 16:18
allora modificando il codice così:

Bumpcar **cars[6]; nella classe A

e

Bumpcar **bc[6];
nella classe B

e l'errore sulla funzione è sparito, però quando cerco di utilizzarla per farmi restituire le cars in questo modo:

bc = oggettoclasseA->getCars();

l'errore è:

error C2440: '=': impossibile convertire da 'Bumpcar *' a 'Bumpcar **[6]'

shinya
12-07-2010, 17:30
Umh... ma tu vuoi un array di Bumpcar o un array di puntatori a Bumpcar?
Sei sicuro di non volere semplicemente un bel
std::vector<Bumpcar> cars
?? :D

Re_Kotc
12-07-2010, 18:09
XD allora..per dirla grezzamente, ho bisogno che la classe B possa accedere ai bumpcar definiti nella classe A, perciò ogni metodo concepibile va bene :P..solo che mancando d'esperienza sono andato un pò a tentativi.

Albi89
12-07-2010, 18:47
L'errore è il Bumpcar **bc[6]; nella classe B, che dovrebbe essere un semplice Bumpcar** bc; cioè un puntatore ad un puntatore a Bumpcar (tipo compatibile con un array di puntatori a Bumpcar) e non costante (in modo da permettere l'assegnazione "di ritorno" dal metodo getCars).
Nella classe A devi mantenere il Bumpcar* cars[6]; mentre a cambiare deve essere il metodo getCars Bumpcar** getCars() const { return cars; }

Occhio insomma ai tipi e al "significato" della notazione [N], che riserva spazio proporzionalmente a N e introduce un puntatore costante: volendo anche ignorare la "constness", nel tuo codice c'è un mismatch tra i tipi perché fai ritornare un Bumpcar** (cars) da una funzione che indica come tipo di ritorno un Bumpcar*!

Ovviamente mi accodo a tutte le considerazioni del caso: a meno che non sia un progetto didattico per scuola/università (con vincoli imposti dal prof.), è il caso di utilizzare il container vector nel proprio codice C++ per renderlo non solo più "error-proof", ma più semplice da correggere.
Tra l'altro, col tuo codice B potrà modificare il contenuto di A direttamente agendo sul puntatore che riceve, che gli garantisce l'accesso diretto all'array: un std::vector invece può essere copiato facilmente.

Re_Kotc
12-07-2010, 20:58
hai ragione avevo fatto confusione con i puntatori, nella B devo dichiarare Bumpcar** bc; quindi un puntatore al puntatore del primo elemento dell'array...però visto che ci siamo, se volessi usare un vector?
grazie mille :)

Albi89
12-07-2010, 21:44
hai ragione avevo fatto confusione con i puntatori, nella B devo dichiarare Bumpcar** bc; quindi un puntatore al puntatore del primo elemento dell'array...però visto che ci siamo, se volessi usare un vector?
grazie mille :)

Non c'è molto da dire al proposito... in classe A e B dovresti avere un std::vector<Bumpcar> cars; e la funzione in A potrebbe essere qualcosa del tipo std::vector<Bumpcar> getCars() const { return cars; }
Ci sono ovviamente una serie di questioni da considerare... questa strategia provoca la copia di tutto il vector, e conseguentemente di ogni oggetto Bumpcar, ad ogni chiamata di getCars(), e non ti permette di modifica da B il contenuto di A (cosa che, a stretto rigore, dovrebbe essere vera sempre, ma potrebbe non essere quello che volevi fare nel tuo programma).
Nulla ti vieta, in questo caso, di utilizzare un vector di puntatori.

Re_Kotc
12-07-2010, 21:47
ti ringrazio moltissimo della disponibilità! :) adesso adatto il mio codice con i suggerimenti che mi hai dato, thanks!