-3

Castle (.NET) や Java などの IoC フレームワークの経験がある開発者からの意見を求めています。

ただし、C++ を使用して実装された同様のものを探しています。後で説明できる理由から、COM は除外されます。Factory、Abstract Factory、または Service Provider のようなパターンを C++ で実装する方法はありますか?

具体的には、IoC は、実行時にクライアント アプリによって検出およびロードできるインターフェースの未知の数の実装を許可する必要があります。

答えとして、私は次のいずれかを望んでいます:

  1. 特定の商用またはオープン ソース C++ IoC 実装へのリンク、または
  2. それを実装しようとした個人的な経験と、もしあれば、いくつかの主要な落とし穴のリスト。

予想外の反対票のため、いくつかの追加仕様を追加する必要があります (OP からは明確ではない可能性があります)。

  1. すべてのコンポーネントが同じバージョンの C++ ランタイム ライブラリにリンクする必要がある場合、実装にクローズド システムが必要な場合は問題ありません。これは素晴らしいことではありませんが、許容範囲です。私は、クライアント アプリケーション ソフトウェアのインストールの一部として、必要なバージョンの C++ ランタイムをインストールするソフトウェアに 10 年間取り組んできました。IOW、これは広範な互換性の問題ですが、ここで尋ねている質問に対する答えではありません。

  2. C++ 標準であるため、unique_ptr について言及しています。カスタムスマートポインターもOKです。unique_ptr はおそらく今までにもっとよく調べられていると思います。

  3. unique_ptr でカスタム デリーターを使用する方法についてのドラフト コードを求めているわけではありません。コンパイルさえしないコードの場合は、はるかに少ないです。これは、すべての賛成票を獲得した答えです。悲しいことに、私が「これは盲人が聴覚障害者を導こうとしているようなものだ」とコメントした後、犯罪者とされる私を罰し、被害者とされる人を支援するという怒りは、不合理な反対票と賛成票をもたらしました. SO のようなサイトで、このようなことが純粋に技術的な問題を脱線させ、礼儀正しさについての個人的な不満に変えてしまうことを、私は本当に悲しく思っています。実際の実装経験を明確に求める質問に対して、無知なコード ドラフトを投げかけるのは控えたほうが礼儀正しいでしょう。(a)

  4. 賢明な回答や適切なリンクが得られなかった後、私は自分でサンプル実装を作成するのにかなりの時間を費やしました. MSVC 2010 のリリース ビルドとデバッグ ビルドの両方で試してみたところ、期待どおりに動作しました。それは私自身の質問に対する私の答えであるため、私が受け入れたとして投票しなかった答えです。これらの問題について実際に経験された方からの良いコメントを期待しています。この回答には、実際にコンパイルして実行しようとすると、コードが言うことを実行しても、2つの反対票があります。

(a) McGraw-Hill Dictionary of American Idioms and Phrasal Verbs および Cambridge Idioms Dictionary によると、正当な憤りを引き起こした攻撃的で無礼で失礼なフレーズの意味へのリンク:

ブラインドをリードするブラインド

4

2 に答える 2

4

unique_ptrクラスを見ると、デフォルトでdefault_deleteクラスのインスタンスを使用していることがわかります。default_delete クラスには次のメソッドがあります: void operator()(T *ptr) const. カスタムのデリータを実装するには、次のようなクラスを作成する必要があります (コードはhereから変更されています)。

class MyDeleter
{
public:
    MyDeleter(FactoryReference *f)
    {
        m_factoryRef = f;
    }
    void operator()(IFace *ptr) const
    {
        delete ptr;
        m_factoryRef->unloadDLL();
    }
private:
    FactoryReference *m_factoryRef;
};

std::unique_ptr<IFace, MyDeleter> GetIFace()
{
    FactoryReferece *myFactory = /* a factory reference */;
    return new std::unique_ptr<IFace, MyDeleter>(myFactory->getIFaceSubclass(), MyDeleter(myFactory));
}
于 2013-09-11T02:21:12.233 に答える