問題タブ [pimpl-idiom]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
3 に答える
1851 参照

c++ - PIMPL の問題: コードの重複なしで impl への複数のインターフェイスを使用する方法

私は、実装クラスがポリモーフィックであるが、インターフェイスにはポインターが含まれているだけであると想定されているこの pimpl 設計を持っています。

そこで、Impl および Intf 基本クラスを作成して、参照カウントを提供します。その後、ユーザーは実装を作成できます。例:

ここに問題があります。クラス Polygon には 2 つの可能な宣言があります。

Polygon1 では draw のコードを継承していないので書き直しました。Polygon2 では、GetImpl() が PolygonImpl を認識しないため、醜い動的キャストが必要です。私がやりたいことは次のようなものです:

しかし、もちろんここに問題があります。Intf から派生しない限り、Interface クラスから GetImpl() にアクセスできません。その場合、Intf が表示されるすべての場所を仮想化する必要があります。

または、各インターフェイスに TImpl*& を格納し、ベース Intf::impl への参照を使用して構築できます。しかし、それは、含まれているすべてのインターフェイスについて、自分自身を指すポインターがあることを意味します。

これらの解決策はどちらも Intf クラスを膨張させ、逆参照を追加し、基本的に単純なポリモーフィズムよりもメリットがありません。

それで、問題は、どこにでもコードを複製するだけでなく(メンテナンスの問題で)この問題を解決する、私が見逃した3番目の方法はありますか?

完全に必要ですが、機能しません: クラスレイアウトをオーバーレイするだけの基本クラスの共用体があればいいのにと思います。ポリモーフィッククラスの場合、まったく同じ vtable レイアウトが必要です。次に、Intf と ShapeInterface の両方がそれぞれ 1 つの T* 要素を宣言し、同じようにアクセスします。

0 投票する
3 に答える
216 参照

c++ - 奇妙な "type class::method() : stuff " 構文 C++

pImpl イディオムのいくつかを読んでいるときに、次のようなものを見つけました。

MyClass::MyClass() : pimpl_( new MyClassImp() )

最初:それはどういう意味ですか?
2番目:構文は何ですか?
そんな初心者でごめんなさい。

0 投票する
3 に答える
622 参照

c++ - 前方宣言されたクラス列挙問題の回避策はありますか?

私は大規模なコードベースを維持しており、前方宣言とpImplイディオムの組み合わせを使用して、コンパイル時間を短縮し、依存関係を減らしています(そしてそれは本当にうまく機能します)

私が抱えている問題は、パブリック列挙を含むクラスにあります。これらの列挙は前方宣言できないため、クラスヘッダーを含める以外に選択肢はありません。例えば:

だから、私はこれを回避する方法を探しており、次のことしか考えられません:

クラス列挙を別の「types」名前空間に移動します

列挙の代わりにintを使用する

私は何を逃しましたか?他の人はこの制限をどのように回避しますか(列挙を前方宣言することはできません)。

0 投票する
3 に答える
1835 参照

c++ - STLフレンドリーなpImplクラス?

ビルドにかなりの時間がかかる可能性のあるプロジェクトを維持しているため、可能な限り依存関係を削減しようとしています。一部のクラスは、pImplイディオムと私がこれを正しく行うこと、およびクラスが STL (特にコンテナー) とうまく連携することを確認したい場合に使用できます。 ? std::auto_ptr実装ポインタに使用しています - これは許容できますか? を使用するboost::shared_ptr方が良いでしょうか?

andSampleImplという名前のクラスを使用するクラスのコードを次に示します。FooBar

0 投票する
4 に答える
397 参照

c++ - Pimplイディオム:実装が不明な場合に使用するsize_typeは何ですか?

GetSize要素の配列を保持するクラスがあり、それにメンバー関数を与えたいと思います。しかし、その関数にどのような戻り型を与える必要がありますか?

私はpimplイディオムを使用しているので、ヘッダーファイルでは、実装が要素を格納するために何を使用するかはわかりません。だから私はただ言うことはできませんstd::vector<T>::size_type、例えば:

0 投票する
7 に答える
2111 参照

c++ - pimpl クラスのプライベート メンバー?

pimpl イディオムで使用されている実装クラスにプライベート メンバーを持たせる理由はありますか? 私が本当に考えることができる唯一の理由は、自分自身から身を守ることです。つまり、プライベート メンバーは、クラスとユーザーの間である種の契約を強制する役割を果たします。この場合、クラスとユーザーはかなり密接に関連しているため、必要ないようです。

0 投票する
2 に答える
505 参照

c++ - 別の名前空間のテンプレートの不透明なオブジェクト

私は次のようにC++で不透明なオブジェクトを作成する方法を知っています:

次に、不透明なオブジェクトが、この名前空間のヘッダーファイルを含めずに、別の名前空間にある既存のクラステンプレートである場合にそれを行う方法を説明します。次のコードは良くありません、それは私の問題を説明するためにここにあります。

私のソースコードの実際のクラスは、この例よりもさらにテンプレート化されています(templateの4つの引数と、それ自体がテンプレート化されたクラスであるものもあります)。

my_class.hppは私のプロジェクトのどこでも使用されているため、一般的なコンパイルには多くの時間がかかります(各cppファイルにmy_class.hppを含めるのに5秒かかります)。したがって、opaque_object.hpp、template_class.hpp ... my_class.hppにあります。

これはどのように行うことができますか?コメントやアイデアは大歓迎です。よろしくお願いします。

0 投票する
2 に答える
834 参照

c++ - Loki の Pimpl 実装を使用するには?

Loki Pimplヘッダーのソース コードへのリンク。同じものを使用する方法に関するドキュメントを見つけることができません。使用方法を説明できる人はいますか。そして、ヘッダーの次の関数は何をしますか。

  1. PimplOwner
  2. 実装
  3. PimplOf
  4. RimplOf
0 投票する
5 に答える
3669 参照

c++ - (特定のコンテナに依存しない)汎用イテレータを返す方法は?

Fooさまざまな型のさまざまなデータを格納し、それらの反復子を返すクラスを設計したいと思います。それは一般的であるはずなので、のユーザーはFooデータがどのように保存されているかを知りません(または何かFooを使用している可能性があります)。std::setstd::vector

私は次のようなインターフェースを書きたいと思っています:

whereIteratorは次のようなものです (.NET のイテレータのように):

しかし、そのようなイテレータは C++ では標準ではないことを知っています。STL と同じようにイテレータを使用する方がよいので、STL アルゴリズムをイテレータで使用できます。

どうやってやるの?(ひょっとして必要iterator_traitsですか?)

0 投票する
1 に答える
604 参照

c++ - クラスメンバー変数で使用される Pimpl イディオム

このクラスを実装する正しい方法は何ですか?