Ereditarietà e puntatori

di il
3 risposte

Ereditarietà e puntatori

Salve a tutti, sono nuovo nel gruppo e vi scrivo perchè ho dei problemi con ereditarietà e puntatori in c++.
Ho una superclasse Oggetto e una sottoclasse Quadrato. Per entrambi ho il file .h e .cpp. In un altro file ho invece il main.
Nel main per poter utilizzare due istanze di quadrato l'istruzioni da utilizzare sono:

Quadrato* quad1 = new Quadrato();
Quadrato* quad2 = new Quadrato();

ho quindi utilizzato i puntatori. Il problema lo riscontro quando a partire da quad1 o quad2 cerco di accedere a proprietà e metodi del superoggetto.
Come posso fare?

E' giusto secondo voi crearmi in Quadrato una proprietà che sia un puntatore a un oggetto Oggetto? Se cosi fosse non sfrutterei l'ereditarietà.

Scusate i giochi di parole, e grazie in anticipo per l'aiuto.
Buon pomeriggio

3 Risposte

  • Re: Ereditarietà e puntatori

    Se proprietà e metodi non sono dichiarati private, puoi benissimo accedere dall'interno di Quadrato a tali proprietà e metodi. Se vuoi accederci dall'esterno allora proprietà e metodi devono essere public.
    Come hai dichiarato la gerarchia?
  • Re: Ereditarietà e puntatori

    <file Oggetto.h>

    class Oggetto
    {
    public:
    Oggetto();
    ~Oggetto();

    GLfloat getPosizioneX();

    GLfloat getPosizioneY();

    GLfloat getPosizioneZ();

    GLvoid setPosizione(GLfloat x, GLfloat y, GLfloat z);
    };

    <file Oggetto.cpp>

    #include "Oggetto.h"

    GLfloat posizione[3] = { 0.0,0.0,0.0 };

    Oggetto::Oggetto()
    {
    }

    Oggetto::~Oggetto()
    {
    }

    GLfloat Oggetto::getPosizioneX() {
    return posizione[0];
    }

    GLfloat Oggetto::getPosizioneY() {
    return posizione[1];
    }

    GLfloat Oggetto::getPosizioneZ() {
    return posizione[2];
    }

    GLfloat Oggetto::setPosizione(GLfloat x, GLfloat y, GLfloat z){
    posizione[0] = x;
    ...
    ...
    }

    <file Quadrato.h>

    class Quadrato : public Oggetto
    {
    private:
    GLuint texture = 0;
    GLint numero = 5;

    public:
    Quadrato();
    Quadrato(GLint num);
    ~Quadrato();

    GLvoid render();
    };

    <file Quadrato.cpp>

    Quadrato::Quadrato()
    {
    }

    Quadrato::Quadrato(GLint num)
    {

    }


    Quadrato::~Quadrato()
    {
    }



    GLvoid Quadrato::render() {
    glTranslatef(getPosizioneX(), getPosizioneY(), getPosizioneZ());
    }


    ///////////////main
    #include "Quadrato.h"
    Quadrato* sfondoMare;
    Quadrato* sfondoCielo;

    sfondoMare->setPosizione(1,2,3);
    sfondoCielo->setPosizione(4,5,6);

    printf("Numero sfondo cielo %d \n", sfondoCielo->getPosizioneX());
    printf("Numero sfondo mare %d \n", sfondoMare->getPosizioneX());

    in entrambi ottengo 4 invece di 1 e 4.

    Sembra che lavoro con la stessa istanza della superclasse invece che essere distinte e separate
  • Re: Ereditarietà e puntatori

    Ti sei accorto che
    
    GLfloat posizione[3] = { 0.0,0.0,0.0 };
    
    è globale e pertanto accessibile da chiunque?
    Rendilo membro (protected) di oggetto e ottieni quel che ti serve.
    Tra l'altro il distruttore di Oggetto (che qui non serve dato che non lavori con puntatori) dev'essere virtual.
Devi accedere o registrarti per scrivere nel forum
3 risposte