nam se osvedcilo toto:
class A {
public:
A();
virtual ~A();
void neco();
virtual void necoJineho();
private:
class AImpl *impl;
};
Trik je v tom impl. Struktura je vzdy stejna i kdyz pridavas fieldy, metody apod, protoze je vse ulozene v impl, ktery je neznamej (neni v public headeru). virtualni destruktor mimo jine zajisti virtualni tabulku (nezmeni velikost ani pridanim dalsich metod). Jinak pracujes normalne s "new".
Na projektu jsme meli asi 60 DLL knihoven a patche fungovali velmi dobre i kdyz menili velmi podstatne funkcionalitu.
Jenze prave me vadi to, ze kdyz bych chtel pridat dalsi interface (dalsi bazovou tridu), tak to musim udelat v AImpl a pak vsechny metody toho interfacu navic jeste pridat do te public tridy.
class AImpl {
void udelejNeco();
}
class A {
void udelejNeco() { m_impl->udelejNeco(); }
private:
AImpl* m_impl;
}
a ted si vymyslim dalsi interface,
class IContext {
void neco();
}
tak musim to prechozi zmenit na:
class AImpl : public IContext {
void udelejNeco();
}
class A {
void udelejNeco() { m_impl->udelejNeco(); }
void neco( m_impl->neco();)
private:
AImpl* m_impl;
}
To se mi vubec nelibi tohle, protoze pak budu chtit pridat dalsich 5 interface a budu porad neco takhle kopirovat, no co to je?