PDA

Visualizza la versione completa : [c++]richiamare vettore in più classi


cerza
05-07-2011, 18:06
salve,
ho un'applicazione costituita da diverse classi, ogni classe è accompagnata da un file header all'interno del quale ho dichiarato proprietà e metodi della rispettiva classe. In una di queste classi è stato dichiarato un vettore ma tale vettore devo richiamarlo in altre due classi, per spiegarmi meglio la classe A crea in vettore , le classi B e C dovrebbero richiamare il vettore per poter accerede ad alcuni elementi, a questo punto ho inserito nelle classi B e C l'inclusione del file header della classe A ma ciò mi provoca errori in fase di linking in quanto il vettore risulta già definito.
come faccio a risolvere questo problema?
grazie mille

maria

oregon
05-07-2011, 18:42
Il problema sta più a monte, è architetturale.

Non puoi condividere un array se questo è un elemento privato di una classe. E non si usano così le classi.

Posta le classi e facci capire meglio ...

cerza
06-07-2011, 10:08
con buona probabilità hai ragione.... dunque la questione è la seguente:
nella classe A viene dichiarato un vettore pubblico, tale vettore deve essere richiamto in altre due classi quindi se non inserisco in queste due classi

#include <ClasseA.h>
non mi ricosce il vettore ma se includo in file.h mi dice che il vettore viene ridefinito più volte.
c'è anche da dire che facendo il digramma delle classi mi risulta un collegamento 1 a molti tra queste classi, quindi traduco il riferimento "molti" con il vettore ma quello 1 dovrei tradurlo conun riferimetno all'oggetto che non mi viene visto se non importo il file.h
non so se adesso il problema è più chiaro.....
ps. non so se posso postare tutto il codice...perchè è molto
grazie per la disponibilità, buona giornata

maria

MisterBean
06-07-2011, 13:03
Non sono sicuro di aver capito bene:
Dichiari un vettore pubblico nella classe A, a cui vuoi accedere dalle classi B e C. Non ti basta includere la classe A per accedere all'elemento, devi anche istanziare un oggetto della classe A per poi accedere:

oggettoDiClasseA.tuoVettore /* fai qualcosa */;
A meno di dichiarare il vettore come static, nel qual caso non ti serve un oggetto di classe A per poter accedere al vettore, basta fare:

ClasseA::tuoVettore /* fai qualcosa */;

cerza
06-07-2011, 13:31
ma se lo dichiaro come static posso poi modificare il contenuto del vettore??

MisterBean
06-07-2011, 13:36
Si, basta che sia pubblico. Un'altra cosa, dichiarandolo static lo devi inizializzare da qualche parte nel tuo programma, te lo chiede il compilatore. Comunque sottoscrivo quello che è stato detto da oregon riguardo al fatto che non si usano così le classi.

cerza
06-07-2011, 13:48
ok, ho capito di avere grossi problemi... potreste suggerirmi un link o altro materiale che mi permetterebbe di capire bene come si usano le classi?
grazie mille

MisterBean
06-07-2011, 15:07
Questo è un bigino di quello che bisogna sapere per "pensare in termini di oggetti":
http://it.wikipedia.org/wiki/Programmazione_orientata_agli_oggetti

cerza
07-07-2011, 10:40
perdonami per l'insisitenza ma non mi è chiaro quanto riportato nel penultimo commento inq uanto ho provato ad usare


Play::ships[selectObj];

nella classe dove mi serviva accedere al vettore solo che mi da errori vari se non inserisco il file Play.h nel file Ship.h, a questo punto poichè dovrei accedere al vettore anche dal main e quindi qui includo Play.h e creo effettivamente un oggetto di tipo Play solo che mi da il seguente errore


simbolo esterno "public: static class std::vector<class Ship,class std::allocator<class Ship> > Play::ships" (?ships@Play@@2V?$vector@VShip@@V?$allocator@VShip @@@std@@@std@@A) non risolto

grazie mille per la disponibilità

maria

oregon
07-07-2011, 11:27
Continui ad usare il C++ come se fosse C

Per questo hai tanti errori e probabilmente ne avrai anche dopo ...

Prova invece a definire il tuo vettore come una proprietà privata della classe a cui accedi tramite apposite "funzioni membro" pubbliche. Una volta che avrai istanziato la classe, tutto il tuo codice potrà accedere al vettore in questione tramite le relative funzioni membro.

Loading