5

大きなプロジェクトには、コード内のどこにでも「fopen」を配置する代わりに、実際のプラットフォームタイプ(ミューテックス、ファイル、スレッドなど)から抽象化するための中央クラスと関数があります。これは良いことですが、さらに進んで、ヘッダーファイル(のような#include <windows.h>)にシステムインクルードを含めないようにします。これは、真のプラットフォームの抽象化とより高速なコンパイルになります。欠点としては、システムタイプ(Windows HANDLEなど)にtypedefすることはできません。

オプション1:PImpl-イディオム

class RwMutex
{
    // .....
private:
   struct Impl;
   Impl*   m_Impl;
}
  • Pro:Cppによく隠されている実装とプラットフォームの種類。
  • 短所:失敗する可能性のある2段階の構築(「新しい」、例外はありません)が含まれます。やるのが面倒。

オプション2:名前空間関数

class RwMutex {
public:
    bool LockRead() {return RwMutexLockRead( this );}
private:
    char m_AnonymousMember[ 16 ];
}
bool RwMutexLockRead( RwMutex* p );
  • 長所:実装はそれにリンクするだけで、それ自体をライブラリに配置するのに理想的です。
  • 短所:メンバーを保持するスペースのreinterpret_castが含まれます。デバッガーでは良くありません。また、多くの作業。

たぶん私はそれに熱心に取り組んでいますが、膨大な量のプロジェクトコードがプラットフォームに依存するインクルードをクリーンアップし、-nostdincオプションによって強制されるとしたら、それは素晴らしいことです。

4

2 に答える 2

4

ポインタを使用するオプション1は悪い考えです。boost::scoped_ptrまたは、可能であれば、を使用してくださいstd::unique_ptr

オプション2は、実装するときに使用しないでください。GotW#28:The FastPimplIdiomを参照してください。ただし、C ++ 11では、これはを使用して正しく実行できますstd::aligned_storage<>。私はかつてpimpl_ptr<T, Size, Align=default>、キャスト、コピー、デストラクタの呼び出しを行い、あなたが正しいものを選択したことを確認するを作成しましたSize

一般に、これがボトルネックであることをプロファイリングして示していない限り、pimplを使用します。

しかし、いつものように、車輪の再発明はしないでください。MutexとThreadsは新しいC++11標準の一部であるため、コンパイラーをアップグレードするか、代わりにBoostを使用してください。ファイルにはBoostを使用します。その理由は、新しいC++11ライブラリの多くの部分がBoostから取得されているためです。

于 2012-12-06T13:05:12.677 に答える
2

なぜImplementationオブジェクトさえあるのですか?コードは同じプラットフォームで変更されるだけでなく、その時点で現在使用しているプラ​​ットフォームで同じ実装を使用することになります。ヘッダーでインターフェースを定義し、ターゲットとする各プラットフォームの実装用にさまざまな*.cppファイルを提供します。#ifndef、#elseなどを使用します。

たとえば、ファイルシステムは次のようになります。

include/
    RwMutex.hpp
    // etc...
src/
    RwMutex/
       RwMutexWin32.cpp
       RwMutexUnix.cpp
       // etc... 

RwMutexWin32.cppは次のようになります。

#ifdef MYLIBPREFIX_PLATFORM_WIN32
#include "RwMutex.hpp"

#include <Windows.h>

// implement the Windows version of the RwMutex class

もう1つの例は、SDL、またはCまたはC++で記述された他のクロスプラットフォームライブラリを調べることです。彼らは主にプリプロセッサシステムを使用しています。Implオブジェクトが指すものを変更したくない場合はほとんどありません(つまり、WindowsマシンでのUnix実装は意味がなく、コンパイルもされません)。

そしてもちろん、本当にこれをやりたいのなら、CMakeを使うことをお勧めします。しかし、他の人が示唆しているように、boost標準ライブラリなどの他のライブラリを使用してみてください。すでに作成されています。

于 2012-12-06T13:30:37.027 に答える