2011-10-25 5 views
2

私は前方宣言を多く使用しました。彼らは多くの#includeを回避し、コンパイル時間を改善し、何を改善するのに役立ちます。しかし、もし私が標準ライブラリのクラスを前方宣言したいのであれば?std :: vectorなどを含む前方宣言

// Prototype of my function - i don't want to include <vector> to declare it! 
int DoStuff(const std::vector<int>& thingies); 

私はそれを転送し、宣言std::vectorに/不可能禁じられています聞いたことがあります。私はすべてのコンテキストでVectorOfNumbers代わりのstd::vector<int>を使用する場合、今

stuff.h

class VectorOfNumbers; // this class acts like std::vector<int> 
int DoStuff(const VectorOfNumbers& thingies); 

stuff.cpp

// Implementation, in some other file 
#include <vector> 
class VectorOfNumbers: public std::vector<int> 
{ 
    // Define the constructors - annoying in C++03, easy in C++11 
}; 

int DoStuff(const VectorOfNumbers& thingies) 
{ 
    ... 
} 

:今this answer to an unrelated questionは私のコードをこのように書き換えることを提案します私のプロジェクトを通して、すべてがうまくいくようになりました。私のヘッダファイルには#include <vector>はもう必要ありません。

この手法には大きな欠点がありますか? vectorが前方に宣言できるという利得はそれを上回ることはありますか?

答えて

3

私はこれをしないだろう理由:

const std::vector<int>& a = a_3rd_party_lib::get_data(); // this type is out of your control 
DoStuff(a); // you cannot pass it to this function! 
+1

VectorOfNumbersは基本的なstd :: vector型の変換タグを自明に提供できませんでしたか? –

+0

@マーティン:それはすべてをコピーします。あなたはこれを望んでいないのですか? – ybungalobill

0

ヘッダーファイルに<vector>が含まれています。 <vector>ヘッダーは複数のインクルードを防ぐために作成されているので、必要な場所にインクルードするだけです。

+2

これはどのようにOPの質問に答えますか? – ildjarn

6

VectorOfNumbersstd::vector<int>として削除した場合(および公開継承を使用したため、この変換は暗黙的に行われています)、未定義の動作の領域に入りました。おそらく、疑わしいよりも誤って起こる可能性が高いです。

私は個人的には、必要なところでvectorを含むことからかなりのコンパイル速度の低下に気づいたことはありませんが、本当にインクルードを分離したい場合は、基礎となるコンテナタイプ(vector)とpimpl vectorは単一のソースファイルに含まれています。

0

これはクラスのインターフェイスではうまく動作しますが、実装ではうまく動作しません。クラスにvectorのメンバーがある場合は、#include <vector>にするか、クラス定義をコンパイルしません。

0

代わりの継承、あなたは、組成物を使用することができます。

// Implementation, in some other file 
#include <vector> 
class VectorOfNumbers 
{ 
    public: 

    std::vector<int>& container; 

    VectorOfNumbers(std::vector<int>& in_container) 
     : container(in_container) 
    { 
    } 
}; 

int DoStuff(const VectorOfNumbers& thingies) 
{ 
    std::sort(thingies.container.begin(), thingies.container.end()); 
    // ... 
} 

欠点は、すべてのアクセスに余分な変数名です。

また、この実装は、VectorOfNumbersでできることを理解できるように、cppsに含まれるヘッダーファイル内に存在する必要があります。

基本的には、ベクターのラッパーを作成するだけです。これは、軽量バージョンのPImplと似ています(ヘッダーの依存関係を回避するだけで、完全なデカップリングは必要ありません)。 Mark Bとybungalobillによって提起された問題を回避します。

しかし、私はそれが本当に価値があるとは思わない。

関連する問題