【问题标题】:A simpler form of pimpl一种更简单的 pimpl 形式
【发布时间】:2011-05-04 15:16:06
【问题描述】:

为什么不选择这个设计:

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

我可以隐藏实现细节并使用源文件中定义的变量和静态函数加速编译吗?如果不是,这个设计有什么问题(除了继承)?

【问题讨论】:

    标签: c++ interface pimpl-idiom information-hiding


    【解决方案1】:

    在第一种情况下,整个程序只有一个 impl_database_for_do_something 实例。您希望每个 A 实例都有一个它的实例。因此,代码在任何意义上都不是等效的。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        您的第一个设计有 一个 向量用于A所有 个实例;后者有一个 per 实例。阅读实例变量与类变量。

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-03-07
            • 1970-01-01
            • 2010-10-06
            相关资源
            最近更新 更多