PDA

Visualizza la versione completa : [C++] Accesso alle funzioni della classe "madre"


sylvaticus
28-02-2006, 15:21
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 va:

AnsiString nome_proprietario= (alunni)* this->getAlumnName;

Ho un sacco di queste situazioni nel programma che mi è capitato tra le mani :-((((

XWolverineX
28-02-2006, 15:40
Hai provato a fare
NomeClasseMadre::Funzione()
Se non va non credo che tu lo possa fare...
In questo caso, ti consiglio di mettere un'ansi string anche nella classe quaderni, e nel costruttore della classe alunno, pass il valore alunno a quello del ansi string di quaderni.
Se posti il codice ti posso fare un esempio pratic.

sylvaticus
28-02-2006, 17:47
no purtroppo non funziona.. ho provato a fare un codice di esempio:

ok.. allora ho questi tre files:
main.cpp, cani.h e persone.h

>>>>persone.h>>>>>>>>>>

#ifndef PERSONE_H
#define PERSONE_H
#include <string>
#include "cani.h"

namespace std{

class persone {
string cognome;
cani *miocane;
public:
persone(string nome);
string getCognome();

};
}

#endif
<<<<<<<<<<<<<<<<<<<<<<<<

>>>>>cani.h>>>>>>>>>>>>>>

#ifndef CANI_H
#define CANI_H
#include <string>

namespace std{

class cani {
string proprietario;
public:
cani();
void setProprietario();

};
}

#endif
<<<<<<<<<<<<<<<<<<<<<<<

>>>>>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();

};

string
persone::getCognome(){
return cognome;
};

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 madre??
E' veramene impossibile??? :-(((

LeleFT
28-02-2006, 17:59
Utilizzando la parola chiave super (dovrebbe esistere anche in C++).


Ciao. :ciauz:

sylvaticus
28-02-2006, 18:44
no.. c'è in java ma non credo in C++ (almeno a leggere alcuni documenti googlando in giro)

Ho scoperto che così il compilatore me lo accetta:

proprietario = ((persone*) this)->getCognome();

ma mi lascia proprietario vuoto.. temo che faccia una nuova istanza di persone invece di far riferimento a quella che ha creato l'istanza sulla quale mi trovo..

ChiaraMorgana
28-02-2006, 19:51
come posso accedere, da dentro la classe quaderni, alle funzioni della classe alunni, ad es. per sapere il nome del proprietario??

Non puoi inserire nella classe alunni una funzione che restituisce per esempio il nome dell'alunno?

In java di solito si fa così...

pprllo
28-02-2006, 22:25
Stai a fare una casino. Come l'hai messa tu sembrava che si parlasse di ereditarietà (infatti molti ti hanno dato risposte in questo senso). Invece il tuo è un semplice problema di puntatori, che si risolve così:


class cani {
persone *owner;
string proprietario;
public:
cani();
void SetOwner(persone *NewOwner);
persone *GetOwner()
}
void cani::SetOwner(persone *NewOwner)
{
owner = NewOwner;
}
persone* cani::GetOwner()
{
return owner;
}

Poi nel costruttore di persone ci scrivi ...


persone::persone(string nome)
{
cognome=nome;
miocane = new cani();
miocane->setProprietario(this);
}

Questo è applicabile per qualunque accoppiamento "contenitore-contenuto".

LeleFT
01-03-2006, 10:38
Originariamente inviato da sylvaticus
proprietario = ((persone*) this)->getCognome();

Da quello che vedo qui non mi sembra affatto un problema di tipo "contenitore/contenuto", ma proprio di ereditarietà.

Ed è proprio gercando con google che avevo trovato questo (http://msdn.microsoft.com/library/en-us/vccelng/htm/key_s-z_1.asp).


The super keyword allows you to explicitly state that you are calling a base-class implementation for a function that you are overriding. All accessible base-class methods are considered during the overload resolution phase, and the function that provides the best match is the one that is called.
Ma essendo tratto dal MSDN forse andrebbe preso con le pinze...

Infatti, la voce successiva riportata da Google mostra questo:


Java also uses the super keyword when a subclass method calls the superclass method. In C++, you use the name of the superclass and the ::operator instead
Tratto da qui (http://www.horstmann.com/ccj2/ccjapp3.html).


Ciao. :ciauz:

pprllo
01-03-2006, 10:44
Originariamente inviato da LeleFT
Da quello che vedo qui non mi sembra affatto un problema di tipo "contenitore/contenuto", ma proprio di ereditarietà.

Ed è proprio gercando con google che avevo trovato questo (http://msdn.microsoft.com/library/en-us/vccelng/htm/key_s-z_1.asp).

Ma essendo tratto dal MSDN forse andrebbe preso con le pinze...

Infatti, la voce successiva riportata da Google mostra questo:

Tratto da qui (http://www.horstmann.com/ccj2/ccjapp3.html).


Ciao. :ciauz:
Infatti è lui che ha scritto male. Guarda come sono strutturate le classi: è un problema di contenitore-contenuto. Tra l'altro un'ereditarietà cani-persone la vedo male anche dal punto di vista della semantica :D

LeleFT
01-03-2006, 10:46
Originariamente inviato da pprllo
Infatti è lui che ha scritto male. Guarda come sono strutturate le classi: è un problema di contenitore-contenuto. Tra l'altro un'ereditarietà cani-persone la vedo male anche dal punto di vista della semantica :D
E' vero... sai, non mi sono soffermato sui nomi delle classi, ma sul codice specifico.

Direi che far discendere un cane da una persona non è tanto corretto, peggio se si vuol far discendere una persona da un cane... :D


Ciao. :ciauz:

Loading