Associazione bidirezionale uno ad uno

di il
2 risposte

Associazione bidirezionale uno ad uno

Ciao a tutti

Stavo cercando di creare un associazione uno ad uno bidirezionale, associo a Persona un Gatto tramite la funzione adotta(), tale funzione associa anche alla Classe Gatto una Persona.

Se non che mi da il seguente errore

 In file included from pad.h:4:0,
                 from main.cpp:3:
gatto.h: In member function ‘void Gatto::stampaPad() const’:
gatto.h:19:39: error: invalid use of incomplete type ‘class Persona’
             if(mypad!=NULL)cout<<mypad->getNome();
                                       ^~
gatto.h:6:7: note: forward declaration of ‘class Persona’
 class Persona;
Ho provato a togliere gli #include e mettere direttamente class Nome_classe; negli header ma continua a darmi errore, qualcuna sa cosa posso fare? questo è il codice:

File pad.h

#ifndef P_H
#define P_H
#include <cstring>
#include "gatto.h"
class Gatto;
using namespace std;

class Persona{
    private:
         string nome;
         Gatto *mycat;
    public:
         Persona(string n=" "):nome(n){mycat=NULL;}
         
         void adotta(Gatto &g){
             mycat=&g;
             mycat->addPad(*this);
         }
         
         string getNome() const{return nome;}
         
         void nomeCat(){
             if(mycat!=NULL)cout<<mycat->getNome();
             else cout<<"non ho gatti";
         }
         
         void abbandona(){mycat=NULL;}
};
#endif
File gattp.h

#ifndef C_H
#define C_H
#include <cstring>
#include "pad.h"
using namespace std;
class Persona;
class Gatto{
    private:
        string nome;
        Persona *mypad;
    public:
        Gatto(string n=" "):nome(n){mypad=NULL;}
        
        void addPad(Persona &p){mypad=&p;}
        
        string getNome() const{return nome;}
        
        void stampaPad() const{
            if(mypad!=NULL)cout<<mypad->getNome();
        }
};
#endif
File main

#include <iostream>

#include "pad.h"
#include "gatto.h"
using namespace std;
int main(){
    Persona p("Carlo");
    Gatto g("Fuffi");
    
    p.adotta(g);
    p.nomeCat();
    
    p.abbandona();
    p.nomeCat();

    g.stampaPad();
    return 0;
}

2 Risposte

  • Re: Associazione bidirezionale uno ad uno

    Ci sono due problemi.
    Il primo è che per avere la classe string devi includere "string", non "cstring".
    Il secondo è che una classe non può accedere a funzioni di altre classi che non sono state almeno dichiarate, per esempio Gatto tenta di accedere al getName di Persona e viceversa. In questo caso è fondamentale dichiarare prima le classi e spostare in avanti le definizioni delle funzioni. Ti riporto un esempio in un unico file, se vuoi fare separazioni secondo me ti viene più semplice fare un unico .h e un unico .cpp.
    
    #include <string>
    #include <iostream>
    using namespace std;
    
    class Persona;
    class Gatto{
        private:
            string nome;
            Persona *mypad;
        public:
            Gatto(string n=" "):nome(n){mypad=NULL;}
            void addPad(Persona &p){mypad=&p;}
            string getNome() const;
            void stampaPad() const;
    };
    class Persona{
        private:
             string nome;
             Gatto *mycat;
        public:
             Persona(string n=" "):nome(n){mycat=NULL;}
             void adotta(Gatto &g);
             string getNome() const;
             void nomeCat();
             void abbandona(){mycat=NULL;}
    };
    
    void Persona::adotta(Gatto &g){
                 mycat=&g;
                 mycat->addPad(*this);
             }
    string Persona::getNome() const {return nome;}
    void Persona::nomeCat(){
                 if(mycat!=NULL)cout<<mycat->getNome();
                 else cout<<"non ho gatti";
             }
    
    string Gatto::getNome() const {return nome;}
    void Gatto::stampaPad() const{
                if(mypad!=NULL)cout<<mypad->getNome();
    }
    
    
  • Re: Associazione bidirezionale uno ad uno

    Grazie mille
Devi accedere o registrarti per scrivere nel forum
2 risposte