Dividere in 2 file dichiarazione classe C++

di il
3 risposte

Dividere in 2 file dichiarazione classe C++

E' possibile dividere in 2 file la dichiarazione di una classe ?
Esempio:
classe.h:

class Classe {
public:
void setClasse(int var1, int var2);
void getClasse(int *v1, int *v2);
};
classe.cpp:

#include "classe.h"
#include <iostream>

class Classe {
private:
int numero1;
int numero2;
};
... 

3 Risposte

  • Re: Dividere in 2 file dichiarazione classe C++

    No. Se quel che ti serve è nascondere l'implementazione puoi usare l'idioma pimpl.
  • Re: Dividere in 2 file dichiarazione classe C++

    Grazie shodan. Scusami l'ignoranza cosa è "l'idioma pimpl" ?
    Se non è possibile fare la suddivisione in due parti della classe, come si può fare in modo che i membri private della classe non siano visibili ai client della classe ?
  • Re: Dividere in 2 file dichiarazione classe C++

    Private IMPlementation (è conosciuto con vari nomi tra cui quello del link)
    https://en.wikipedia.org/wiki/Opaque_pointe

    In sostanza nella classe di cui si vuole nascondere l'implementazione si scrive un puntatore opaco, definito poi nel file.cpp.
    Al netto di controllo errori, in pratica si ha qualcosa del genere (come caso di studio almeno):
    
    //in file.h
    class Prova {
        public:
            Prova();
            Prova(const Prova&);
            ~Prova();
            void setClasse(int var1, int var2);
            void getClasse(int *v1, int *v2);
        private:
            struct Pimpl; // struttura opaca
            Pimpl* pimpl; 
    };
    
    //////////////////////////////////
    // in file.cpp
    struct Prova::Pimpl {
        int numero1;
        int numero2;
    };
    
    Prova::Prova() : pimpl(new Pimpl) {}
    
    Prova::Prova(const Prova& rhs) {
        pimpl = new Pimpl(*rhs.pimpl);
    }
    
    Prova::~Prova() {
        delete pimpl;
    }
    
    void Prova::setClasse(int var1, int var2) {
        pimpl->numero1 = var1;
        pimpl->numero2 = var2;
    }
    
    void Prova::getClasse(int *v1, int *v2) {
        *v1 = pimpl->numero1;
        *v2 = pimpl->numero1;
    }
    
Devi accedere o registrarti per scrivere nel forum
3 risposte