0

为什么不选择这个设计:

// 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

4 回答 4

10

在第一种情况下,整个程序只有一个 impl_database_for_do_something 实例。每个 A 实例都需要一个它的实例。所以代码在任何意义上都不是等效的。

于 2011-05-04T15:21:14.453 回答
6

如果您按照您的建议使用全局向量来存储状态,您将不得不以某种方式确保 A 类的不同实例使用向量的不同部分(除了这样做的明显困难之外,请考虑如果不同的线程使用这会变得多么困难A) 的不同实例。只有当 A 是单例时,这种设计才有意义。

于 2011-05-04T15:20:46.630 回答
2

您的第一个设计为;的所有实例都有一个向量。后者每个实例都有一个。阅读实例变量与类变量。A

于 2011-05-04T15:30:24.913 回答
0

这根本不是 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);
}

警告:此代码不处理正确的复制/分配行为,它留给读者作为练习。

于 2011-05-04T15:34:11.960 回答