Hvis du kikker på mit eksempel fra "23-10-06 22:49" kan du se at det virker hvis der er andre argumenter end objekter der der laves med default constructor. Det er det der sker med dit eksempel fra "24-10-06 21:08".
"Nogen" er nødt til at gemme objektet af typen ImplementationDetails indtil klassen der bruger det er færdig med det.
Hvis du igen kikker på mit eksempel fra "23-10-06 22:49" så er linien:
std::cout << "Whatever: " << b.a.i << std::endl;
Ugyldig, b.a eksisterer IKKE på det tidspunkt. a ophørte med at eksistere da b's constructor afslutttede.
Den lette metode er at lade klassen der bruger objektet slette det i sin destructor. For at det kan virke SKAL base klassen have en virtuel destructor:
#include <iostream>
class Base
{
public:
virtual ~Base()
{
std::cout << "Base::~Base" << std::endl;
}
virtual void foo() = 0;
};
class B
{
public:
B(Base* _base) : base(_base)
{
std::cout << "B::B" << std::endl;
}
void Do()
{
base->foo();
}
~B()
{
delete base;
std::cout << "B::~B" << std::endl;
}
Base* base;
};
class D : public Base
{
public:
virtual void foo()
{
std::cout << "D::foo" << std::endl;
}
};
int main()
{
B b(new D());
b.Do();
std::cin.get();
}
Man kan indvende at det er grimt at lade en part oprette et objekt og en anden nedlægge det igen.
Man kan løse dette ved at bruge en "class factory":
http://damb.dk/classfactory.php