J'ai trouvé utile d'utiliser la déclaration anticipée des classes en combinaison avec std::unique_ptr
comme dans le code ci-dessous. Il compile et fonctionne avec GCC, mais l'ensemble semble un peu étrange, et je me demande si c'est un comportement standard (c'est-à-dire requis par la norme) ? Puisque B n'est pas un type complet lorsque je déclare la fonction unique_ptr
.
A.hpp
#include <memory>
class B;
class A {
std::unique_ptr<B> myptr;
// B::~B() can't be seen from here
public:
~A();
};
A.cpp
#include "B.hpp"
//B.hpp has to be included, otherwise it doesn't work.
A::~A() = default; // without this line, it won't compile
// however, any destructor definiton will do.
Je soupçonne que cela a à voir avec le destructeur (et donc la nécessité d'appeler le destructeur de l'utilisateur). unique_ptr<B>
) est défini dans une unité de compilation spécifique (A.cpp).