Pimplのよりシンプルな形式
-
28-10-2019 - |
質問
このデザインを選択してみませんか:
// 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){}
};
ソースファイルで定義された変数と静的関数を使用した実装の詳細とスピードアップコンパイルを非表示にできますか?そうでない場合、このデザインの何が問題になっていますか(相続以外)?
解決
グローバルベクトルを使用して提案された状態を保存する場合、クラスAの異なるインスタンスがベクトルの異なる部分を使用することを確認する必要があります(そうすることの明らかな難しさに加えて、異なるスレッドが使用する場合にこれがどれだけ難しくなるかを検討する必要がありますa)のさまざまなインスタンス。このデザインは、Aがシングルトンである場合にのみ非常に理にかなっています。
他のヒント
最初のケースでは、プログラム全体にempl_database_for_do_somhinestのインスタンスが1つしかありません。 Aのインスタンスごとに1つのインスタンスが必要なため、コードは何らかの意味で同等ではありません。
あなたの最初のデザインがあります 1 のベクトル 全て のインスタンス A
;後者には1つあります あたり 実例。インスタンス変数とクラス変数を読み上げます。
これは、PIMPL:実装へのポインターではありません。
あなたはこのようにそれをすることができます:
// 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);
}
警告: このコードは、適切なコピー /割り当ての動作を扱うものではなく、読者への演習として残されています。
所属していません StackOverflow