I’d recommend 4th:
////-------------------------
/// vtkClass.h
#include <memory> // for std::unique_ptr
class vtkClass : public vtkObject
{
private:
class vtkInternals;
std::unique_ptr<vtkInternals> Internals;
}
////-------------------------
/// vtkClass.cpp
class vtkClass::vtkInternals
{
public:
...
};
vtkClass::vtkClass()
: Internals(new vtkClass::vtkInternals())
{
}
vtkClass::~vtkClass() = default;
BTW, your #3 is incomplete. You’d need vtkStandardNewMacro(...)
etc. for vtkInternals which IMO just is an overkill.