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à)?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top