View Full Version : [C++] problemino puntatori
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
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**.
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..
che stupido non ho letto la seconda parte del tuo messaggio! ora provo a modificare tutto..
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]'
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
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.
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.
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 :)
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.
ti ringrazio moltissimo della disponibilità! :) adesso adatto il mio codice con i suggerimenti che mi hai dato, thanks!
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.