16

.hppファイルで完全な定義を必要としないクラスがある場合、私は通常、主に前方宣言を使用します

元)

 //B.hpp

 namespace A_file {
   class A;
 }

 namespace B_file {

  class B {
   public:
        B();
   private:
        A *ptr_to_A;
  }
 }

 //B.cpp

 #include "A.hpp"
 using namespace A_file;

 namespace B_file {

   B(int value_) {
        *ptr_to_A = new A(value_);
   }

   int some_func() {
        ptr_to_A->some_func_in_A();
   }
 }

私はこの種のコードを書きます。hpp全体を含めてまた節約できると思います。(コメントしてください、あなたが言うなら、これは健康的ではありません)

std名前空間のオブジェクト/クラスに対して同じことを行う方法はありますか?方法がある場合、それは大丈夫ですか、それとも副作用がありますか?

4

1 に答える 1

29

ヘッダー ファイルで独自のクラスを前方宣言して、コンパイル時間を節約できます。ただし、名前空間 std のクラスはできません。C++11 標準 17.6.4.2.1 によると:

特に指定がない限り、名前空間 std または名前空間 std 内の名前空間に宣言または定義を追加する場合、C++ プログラムの動作は未定義です。

これらのクラスの一部はテンプレート化されたクラスの typedef であるため、単純な前方宣言は機能しないことに注意してください。たとえば#include<iosfwd>の代わりに使用できますが、、 などの前方宣言だけを持つ同様のヘッダーはありません。#include<iostream>stringvector

詳細については、GotW #34、前方宣言を参照してください。

于 2012-04-24T00:27:25.933 に答える