Forward Declaration of variables/classes in std na

2019-02-08 17:41发布

I usually use forward declaration predominantly, if I have a class that does not need complete definition in .hpp file

Ex)

 //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();
   }
 }

I write this kind of code. I think, it will save including the whole hpp again. (Feel free to comment, if you thing, this is not healthy)

Is there a way that I can do the same for objects/classes in std namespace? If there is a way, is it okay or does it have side effects?

1条回答
爷、活的狠高调
2楼-- · 2019-02-08 18:42

You can forward declare your own classes in header files to save compilation time. But you can't for classes in namespace std. According to the C++11 standard, 17.6.4.2.1:

The behavior of a C++ program is undefined if it adds declarations or definitions to namespace std or to a namespace within namespace std unless otherwise specified.

Note that some of these classes are typedefs of templated classes, so a simple forward declaration will not work. You can use #include<iosfwd> instead of #include<iostream> for example, but there are no similar headers with just forward declarations for string, vector, etc.

See GotW #34, Forward Declarations for more information.

查看更多
登录 后发表回答