2

私は前方宣言をよく使用しました。それらは多く#includeのを回避し、コンパイル時間を改善するのに役立ちます。しかし、標準ライブラリでクラスを前方宣言したい場合はどうなりますか?

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

前方宣言は禁止/不可能だと聞きましたstd::vector。さて、無関係な質問に対するこの答えは、私のコードを次のように書き直すことを示唆しています。

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)
{
    ...
}

VectorOfNumbersこれで、プロジェクト全体ですべてのコンテキストの代わりに使用するとstd::vector<int>、すべてがうまくいくようになり#include <vector>、ヘッダーファイルに含める必要がなくなります。

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

4

5 に答える 5

6

VectorOfNumbersa を aとして削除したことがある場合std::vector<int>(パブリック継承を使用したため、この変換は暗黙的です)、未定義の動作の領域に入りました。これはおそらく、人が思っているよりも偶発的に起こる可能性が高いです。

個人的には、必要な場所にインクルードするだけでコンパイルが大幅に遅くなることに気付いたことはありませんが、本当にインクルードを分離したい場合は、基になるコンテナー タイプ ( ) を認識vectorしないクライアント API インターフェイスを使用し、インクルードを 1 つのソースにピンプします。ファイル。vectorvector

于 2011-10-25T20:57:40.360 に答える
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! 
于 2011-10-25T21:04:28.087 に答える
0

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

于 2011-10-25T20:53:25.663 に答える
0

これは、クラスのインターフェースではうまく機能しますが、実装では機能しません。クラスにメンバーが含まれている場合は、vectorメンバーが必要です。そうでない#include <vector>場合、クラス定義はコンパイルされません。

于 2011-10-25T20:58:56.120 に答える