20

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?

howtechstuffworks
  • 1,824
  • 4
  • 29
  • 46

1 Answers1

33

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.

JohnPS
  • 2,518
  • 19
  • 17
  • 6
    +1. Predictably enough, the precedent set by `` is also best practice: prefer to have an extra forward declaration header, included by the "normal" header to get compile-time checks for ongoing validity, and by clients who only need the forward declarations. It should "live" and be maintained with the library whose code is forward declares, not the client code! The exact reason given in the GotW above drives this: structures may become typedefs of templates, templates may add arguments etc.. – Tony Delroy Apr 24 '12 at 01:37