Foo
直接実装しないクラスがありますが、外部ライブラリ(FooXternal1
またはFooXternal2
)をラップします。これを行うために見た1つの方法は、プリプロセッサディレクティブを次のように使用することです。
#include "config.h"
#include "foo.h"
#ifdef _FOOXTERNAL1_WRAPPER_
//implementation of class Foo using FooXternal1
#endif
#ifdef _FOOXTERNAL2_WRAPPER_
//implementation of class Foo using FooXternal2
#endif
aconfig.h
は、これらのプリプロセッサフラグ(_FOOXTERNAL1_WRAPPER_
および_FOOEXTERNAL2_WRAPPER_
)を定義するために使用されます。これは、プリプロセッサディレクティブを使用している、デバッグが難しいなどの理由で、C ++プログラマーコミュニティに嫌われている印象があります。さらに、両方の実装を並行して存在させることはできません。
Foo
基本クラスを作成し、それを継承して、両方の実装が互いに並行して存在できるようにすることを考えました。しかし、私は2つの問題に遭遇しました。
- 純粋仮想関数:
cannot instatiate an object of type 'Foo'
、使用中に必要です。 - 仮想関数は、(適切な)実装なしでオブジェクトを実行するリスクを伴います。
私は何かが足りないのですか?これを行うためのよりクリーンな方法はありますか?
編集:要約すると、ラッピングを行うには3(.5 ?!)の方法があります-2(.5)はicepackによって与えられ、最後はSergeyによって与えられます1-ファクトリメソッドを使用します2-プリプロセッサディレクティブを使用します2.5-makefileまたはプリプロセッサディレクティブの作業を効果的に行うためのIDE3.5-Sergayによって提案されたテンプレートを使用する
リソースが限られている組み込みシステムに取り組んでいるtemplate<enum = default_library>
ので、テンプレートの特殊化を使用することにしました。後のユーザーにとっては理解しやすいです。少なくともそれは私が思うことです