Say we have this header file:
#pragma once
#include
class MyClass
{
public:
MyClass(double);
/* ... */
private:
If your MyClass
has a member of type std::vector
then the header that defines MyClass
needs to #include
. Otherwise, the only way users of MyClass
can compile is if they #include
before including the definition of MyClass
.
Although the member is private
, it is still part of the class, so the compiler needs to see a complete type definition. Otherwise, it cannot do things such as compute sizeof(MyClass)
, or instantiate any MyClass
objects.
If you want to break the dependency between your header and
there are techniques. For example, the pimpl ("pointer to implementation") idiom.
class MyClass
{
public:
MyClass(double first_value);
/* ... */
private:
void *pimpl;
};
and, in the source file that defines members of the class;
#include
#include "MyClass.hpp"
MyClass::MyClass(double first_value) : pimpl(new std::vector())
{
}
(and also, presumably, do something with first_value
, but I have omitted that).
The tradeoff is that every member function that needs to use the vector needs to obtain it from the pimpl
. For example, if you want to get a reference to the allocated vector
void MyClass::some_member_function()
{
std::vector &internal_data = *static_cast *>(pimpl);
}
The destructor of MyClass
will also need to release the dynamically allocated vector.
This also limits some options for the class definition. For example, MyClass
cannot have a member function that returns a std::vector
by value (unless you #include
)
You'll need to decide if techniques like the pimpl idiom are worth the effort to make your class work. Personally, unless there is some OTHER compelling reasons to separate the class implementation from the class using the pimpl idiom, I would simply accept the need for #include
in your header file.