Более простая форма прыщей - PullRequest
0 голосов
/ 04 мая 2011

Почему бы не выбрать этот дизайн:

// 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); }

Вместо этого:

// 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){}
};

Могу ли я скрыть детали реализации и ускоренную компиляцию с переменными и статическими функциями, определенными в исходном файле? Если нет, что не так с этим дизайном (кроме наследования)?

Ответы [ 4 ]

10 голосов
/ 04 мая 2011

В первом случае есть только один экземпляр impl_database_for_do_something для всей программы. Вы хотите один экземпляр этого на экземпляр A. Таким образом, код ни в каком смысле не эквивалентен.

6 голосов
/ 04 мая 2011

Если вы используете глобальные векторы для хранения состояния, как вы предлагаете, вам каким-то образом нужно будет убедиться, что разные экземпляры класса A используют разные части вектора (кроме очевидных трудностей, связанных с этим, подумайте, насколько сложнее это получается, если разные потоки используют разные экземпляры A). Этот дизайн имеет большой смысл только в том случае, если A является синглтоном.

2 голосов
/ 04 мая 2011

Ваш первый дизайн имеет один вектор для всех экземпляров A; последний имеет один на экземпляр. Читайте о переменных экземпляра и переменных класса.

0 голосов
/ 04 мая 2011

Это вовсе не PIMPL: указатель на IMPLementation.

Вы могли бы сделать это так:

// 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);
}

Предупреждение: этот код не относится к правильному поведению копирования / назначения, он оставлен читателю в качестве упражнения.

...