Newsgroup: it.comp.lang.c++
Titolo: Accedere ai membri di una classe da dentro un oggetto puntato

Ho una classe alunni i cui membri hanno tra le proprietà un puntatore
alla classe quaderni e tra le funzioni una funzione getAlumnName();
come posso accedere, da dentro la classe quaderni, alle funzioni della
classe alunni, ad es. per sapere il nome del proprietario??
Ho provato questo ma non funziona:
AnsiString nome_proprietario= (alunni)* this->getAlumnName;
Ho un sacco di queste situazioni nel programma che mi è capitato tra
le mani :-((((

sylvaticus wrote:

una buona idea sarebbe quella di imparare il c++ alla radice.
in una funzione membro della classe quaderni, this è un puntatore ad un 
oggetto di tipo quaderni, il cast che stai cercando di fare è 
completamente errato.
-- 
"Chuck Norris usa James Bond come antispyware."
"buuuhhhhhhhhhhrrrrrrr"

ok, ma c'è un modo per risalire alle funzioni -almeno quelle pubbliche
- dell'istanza della classe alunni che ha creato e poi puntato il
quaderno??
sto provando a fare un esempio con il quale spiegarmi meglio..

>>>>main.cpp>>>>>>>>>>>
#include "persone.h"
#include "cani.h"
#include <string>
#include <iostream>
using namespace std;
cani::cani(){
};
void
cani::setProprietario() {
	proprietario = (persone) this->getCognome();
};
persone::persone(string nome){
	cognome=nome;
	miocane = new cani();
	miocane->setProprietario();
};
main (){
	persone* proprietario_di_cane;
	proprietario_di_cane = new persone("Rossi");
	cout << "fatto"<<endl;
};
<<<<<<<<<<<<<<<<<<<<<<<
Quello che non funziona è "proprietario = (persone)
this->getCognome();"
Ovviamente in quest'esempio potrei fare qualcosa del tipo:
miocane->setProprietario(cognome);
ma l'idea generale è:
ho una classe.
In questa classe "madre" viene dichiarato un puntatore ad un oggetto di
un altra classe e quindi viene creato con new un istanza di questa
seconda classe.
Quando sono dentro alla seconda classe, come posso far riferimento alle
funzioni della classe matre??
E' veramene impossibile??? :-(((

 E' veramene impossibile??? :-(((
Ni. Come ti dicevo prima "A meno che la classe non abbia come membro un 
puntatore alla classe che tu chiami 'madre'".
A

Non conosci ancora 'Joe Natta'? Ti esorto calorosamente a visitare il
suo sito a: 
www.joenatta.com
 !
Ciao, io sono Alessandro Saitta di 37 anni (da compiere il 25 Maggio
2006) abitante a Follonica(GR) ITALIA in via Cassarello, 131. Sono un
esibizionista al quale non piace stare tra la gente (così evito ogni
sorta di problema, quali litigi. incidenti, furti, ecc.), in particolar
modo  nelle comunità dove tutto viene obbligatoriamente condiviso
(spese, doveri, ecc.) e si vuole far affermare l'uguaglianza e la
solidarietà tra gli individui. Non mi piacciono le norme, le regole,
il dialogo, l'educazione, il perbenismo, la cultura, che sono  valori
imprescindibili nelle comunità, quindi l'unico modo per appagare
questo mio egocentrismo, sono riuscito a trovarlo diventando uno
spammer (dato che in Rete posso farmi pubblicità anche senza uscire di
casa e standomene tranquillo per i cazzi miei).  Però io non faccio
pubblicità per denaro, dato che il denaro nella vita serve solo ai
burattini e neppure ho qualcosa da dire o fare (in special modo facendo
fatica e/o lavorando) giacché ritengo che tutti i grandi temi della
nostra società (politica, scienza, tecnologia, arte, sport,
spettacolo, informazione, medicina, legge, ecc.) siano solo cose
superflue ed inutili alla vita (chi dice che esse siano cose serie,
può essere solo un pappagallo idiota od un burattinaio). Se una
persona ha le 'palle' oltre ad un po' d'intelligenza riesce a vivere
bene anche da solo, senza rompersi il cazzo a trovare compromessi per
andare d'accordo con gli altri.
Io voglio solo che il mio nome sia letto dappertutto e questo è
l'unico scopo della mia vita da spammer. Soddisfazione la ottengo anche
dal riuscire ad essere famoso evitando di sforzarmi nel pensare, dire o
fare qualcosa di particolare e/o impegnativo, come invece è obbligata
a fare la massa.
P.S. Negli ultimi tempi, nei pomeriggi dal lunedì al Venerdì, mi
trovi anche presso l'ufficio 'RAS assicurazioni' di via Cassarello
88/90 dove faccio compagnia alla mia amica Serena nelle sue dure
giornate lavorative (ma io non ci lavoro... Non penserete mica che io
mi sia messo a lavorare, vero? Se io dovessi andare a lavoro, occuperei
inutilmente 8 ore delle mie giornate, dato che il denaro per me non
vale niente ed ho moltissime cose da fare, molto più appaganti che
lavorare... :).

grazie AnalogFile... in effetti ero riuscito a compilare usando
proprietario = ( (persone*) this ) -> getCognome();
ma mi lasciava proprietario vuoto (credo che crei al volo una nuova
istanza di persone... oppure me l'ha automaticamente castato a void*
come scrivi)
In ogni caso il tuo ultimo esempio è abbastanza spiegante..
Ho la sensazione che la soluzione più pratica sia appunto dichiarare
un puntatore a persone tra le proprietà di cane ed assegnare a quel
puntatore l'indirizzo della persona proprietaria nel costruttore..
anche se non saprei come fare, perchè mi parrebbe di creare un
riferimento circolare.. il cane è una proprietà della persona ma poi
anche la persona risulterebbe una proprietà del cane.. ???

 anche la persona risulterebbe una proprietà del cane.. ???
Innanzitutto, in C++ non c'è niente che si chiami "proprietà". Esistono,
invece, i "membri dati". In secondo luogo, qui stiamo parlando di membri
che sono dei *puntatori*, non instanze di tipo 'cane' o 'persona'.
Quindi, cercando di esprimere il concetto a cui presumibilmente alludevi,
diremo:
  la classe 'persona' contiene un puntatore a un oggetto 'cane' 
  e la classe 'cane' contiene un puntatore a un oggetto 'persona'
Questo in sè non è problematico. Se sia o meno un design appropriato per il
problema che devi affrontare, è tutta un'altra questione.
Tutt'altra questione è anche la gestione del lifetime degli oggetti
instanzia con 'new', che devono singolarmente essere distrutti con
'delete', evitando accuratamente che:
 - sia usato un puntatore all'oggetto dopo che l'oggetto è stato distrutto
 - sia invocato 'delete' più volte sullo stesso valore
Max