I'm declaring a pure virtual class that will provide a unified interface for a handful of derived classes. My instinctual way to organize this would be to create a base folder with the header for the base class (e.g lib/Base.h
) and then create subfolders for the header + source file of the derived classes (so lib/implA/ImplA.h
,lib/implA/ImplA.cpp
and so forth). This keeps the files short, but feels cluttered.
Would it be considered good practice to gather the definitions of the derived classes in the header lib/Base.h
and keep the various implementations in the same folder?
Two-file folders (like lib/implA/ImplA.h
, lib/implA/ImplA.cpp
) are unnecessary, for small projects people usually just put everything in lib/
. If lib/
becomes too cluttered, put this whole hierarchy in lib/my_hierarchy/Base.h
, lib/my_hierarchy/ImplA.cpp
, etc. Maybe extract a logical subsystem instead of a hierarchy. Just keep reasonable folder sizes and some organized structure.
As for putting multiple declarations in the same header, it's your design choice. As far as I know, there's no single "best practice" in C++ regarding this. C++ doesn't enforce one class per file, like Java does. However, including a lot of classes in a single header means slightly longer compilation times for users, because that long header needs to be parsed in every .cpp
file where it's #include
d. Usually people try to keep their headers minimal, but also provide a convenience "aggregate" header that includes all other headers (like bits/stdc++.h
for the standard library). In your case, that would be:
// lib/lib.h
#include "my_hierarchy/Base.h"
#include "my_hierarchy/ImplA.h"
// etc.
So that users who don't mind longer compilation times can just #include <lib/lib.h>
and have everything, while others can #include
only classes they need.