|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Apr 2010
Messaggi: 67
|
[C++/OO] Oggetti dentro una classe: possono comunicare con quest'ultima?
Saluto tutti e mi scuso per l'orribile titolo, non sono riuscito a trovare niente di stimolante!
Arrivo al dunque: ho una classe che, con un vector, raccoglie una serie di puntatori ad altri oggetti. Questa classe "madre" ha anche una variabile pubblica. La mia domanda: uno qualsiasi degli oggetti del vector può accedere a quella variabile pubblica? Se sì, come? Come sempre grazie per la disponibilità! ![]() |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Se il vector contiene puntatori ad oggetti, devi trovare il modo di collegarli alla classe "madre" che fa da contenitore. A quel punto sì, se il membro è pubblico potrai accedervi anche da lì, altrimenti puoi promuoverlo a protected e rendere friend le classi che infili nel vector. Ma mi sa comunque di zozzata.
![]()
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Apr 2010
Messaggi: 67
|
Chiamiamolo "workaround" che fa più figo
![]() Intanto grazie per la risposta! Però aggiungo un pezzo: se la classe madre non ha nessuna parentela con gli oggetti inclusi nel vector (ovvero sono tipi differenti) il tuo suggerimento rimane valido? |
![]() |
![]() |
![]() |
#4 |
Member
Iscritto dal: Jul 2008
Messaggi: 237
|
Non c'è verso di fare quel che vuoi se il contenuto non conosce il contenitore.
Pensa a un vettore di string. std::string rimane invariata e non conosce il vettore, né tantomeno un'eventuale classe con riferimento al vector stesso. C'è un problema non indifferente, in tutto questo: in C++ quel che vuoi fare crea una dipendenza circolare, che come in qualunque classe di ingegneria del software ti insegnano, è da evitare come la peste. In altri linguaggi l'uso di un'interfaccia potrebbe salvarti ma qui ti consiglio un redesign in cui i contenuti non abbiano necessità di conoscere il contenitore. |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Sicuramente il design può essere rivisto ma non vedo il problema delle interfacce per il C++. |
|
![]() |
![]() |
![]() |
#6 |
Member
Iscritto dal: Jul 2008
Messaggi: 237
|
Perche C++ non ha il concetto di interfaccia, e una classe astratta dove tutti i metodi sono pure virtual resta un hack con alcuni svantaggi.
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Ma soprattutto, che c'entra tutto questo con la programmazione OO?
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
O forse simboleggia i due maroni che gli fa il C++.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
![]() |
![]() |
![]() |
#10 | |
Member
Iscritto dal: Jul 2008
Messaggi: 237
|
Quote:
Un altro scenario molto banale: RTTI per testare la presenza o meno di un'interfaccia... Ce ne sono molti altri, più o meno insidiosi. |
|
![]() |
![]() |
![]() |
#11 | ||
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
E dove starebbe il problema? Non sei mica obbligato ad usarla. Non lo vedo certo come un problema per l'utilizzo delle interfacce in C++, specialmente nel caso in esame.
Quote:
E perchè mai uno non potrebbe creare l'interfaccia e poi una classe base per le implementazioni dell'interfaccia ed ereditare da quella classe? Avresti lo stesso problema? No. Ancora una volta non vedo il problema, nè tanto meno applicato al caso in esame. Quote:
Basta usare dynamic_cast se quanto ottenuto è NULL allora non c'è. Inoltre non credo che in questo caso verrà mai usato in una qualunque forma RTTI. |
||
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
![]() |
![]() |
![]() |
#13 |
Member
Iscritto dal: Jul 2008
Messaggi: 237
|
[OT]
Il problema non emerge direttamente, ma a seconda della natura del progetto può presentarsi benissimo in altri momenti e, se ci sono, con altri sviluppatori del progetto. In Java/C# se uno implementa in una classe astratta un'interfaccia e poi eredita dalla classe astratta si è scelto l'unica classe da cui può ereditare. In c++ questo non funziona. E in C++ come potrebbe poi dirsi ben definito il caso in cui una eredita da una classe astratta che implementa alcuni metodi di un'interfaccia ed eredita (diciamo per una svista) anche da un'altra classe che implementa la medesima interfaccia? All in all a me sembra una soluzione sporca quella in C++, ma quel che importa è che siamo OT ![]() [/OT] |
![]() |
![]() |
![]() |
#14 | ||||
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Quote:
Quote:
Quote:
La soluzione corretta è rivedere il design. |
||||
![]() |
![]() |
![]() |
#15 | ||||
Member
Iscritto dal: Jul 2008
Messaggi: 237
|
Quote:
Quote:
Quote:
![]() Quote:
![]() |
||||
![]() |
![]() |
![]() |
#16 | |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
![]()
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 04:01.