Una forma più semplice di pimpl
-
28-10-2019 - |
Domanda
Perché non scegliere questo design:
// A.hpp
class A
{
public:
void do_something();
};
// A.cpp
#include "A.hpp"
#include <vector>
std::vector<int> impl_database_for_do_something;
static void impl_helper_for_do_something(const std::vector<int>& database){}
void A::do_something(){ impl_helper_for_do_something(impl_database_for_do_something); }
Invece di questo:
// A.hpp
#include <vector>
class A
{
public:
void do_something();
private:
std::vector<int> database_for_do_something_;
void helper_for_do_something(const std::vector<int>& database){}
};
Potrei nascondere i dettagli dell'implementazione e la compilazione accelerata con variabili e funzioni statiche definite nel file di origine? In caso contrario, cosa c'è che non va in questo design (oltre all'eredità)?
Soluzione
Se usi vettori globali per archiviare lo stato come proponi, dovrai in qualche modo assicurarti che diverse istanze di classe A utilizzino diverse parti del vettore (oltre alle ovvie difficoltà a farlo, considera quanto ottiene più difficile se i thread diversi usano diverse istanze di a). Questo design ha molto senso solo se A è un singleton.
Altri suggerimenti
Nel primo caso esiste solo un'istanza di impl_database_for_do_something per l'intero programma. Ne vuoi una istanza per istanza di A. Quindi il codice non è in alcun senso equivalente.
Il tuo primo design ha uno vettore per tutto istanze di A
; Quest'ultimo ne ha uno per esempio. Leggi su variabili di istanza rispetto alle variabili di classe.
Questo non è affatto PIMPL: puntatore all'implementazione.
Potresti farlo in questo modo:
// A.hpp
#include <boost/shared_ptr.hpp>
class A
{
public:
A();
void foo();
private:
struct Impl;
boost::shared_ptr<Impl> _impl;
};
// A.cpp
#include <vector>
#include "A.hpp"
struct A::Impl {
std::vector<int> _data;
};
A::A(): _impl(new std::vector<int>()) {}
void A::foo() {
_impl->_data.push_back(3);
}
Avvertimento: Questo codice non si occupa del corretto comportamento di copia / assegnazione, viene lasciato come esercizio per il lettore.