Ich habe eine knifflige zirkuläre Einschluss Problem, dass ich nicht weiß, wie zu lösen. Fazit:Templated Funktion führt zu Circular Inclusion
IApp
erbt vonComponent
Component
implementiert eine Templat-Funktion in seinem Header-Datei, dieIApp::registerForEvent
Welche Technik oder Methode verwendet, kann ich zu beheben verwenden/vermeiden diese kreisförmige Aufnahme?
class Component;
class IApp;
class Component
{
IApp* app;
// Error: Invalid use of incomplete type 'class IApp'
template<typename T>
void registerEvent(const int& evtId, Status (T::*func) (int))
{
auto res = std::bind(func, (T*)this, std::placeholders::_1);
app->registerForEvent(evtId);
}
};
class IApp : public Component
{
public:
void registerForEvent(const int& evtId)
{
printf("IApp::registerForEvent\n");
// ...
}
};
Sie können kompilieren, wenn Sie eine Forward-Deklaration verwenden, aber Sie beheben das Problem, indem Sie fragen: "Ist' IApp' wirklich eine 'Component'?" "Kann ich' IApp' in zwei Klassen zerlegen: eine 'Component' und eine' ComponentRegistry', vielleicht? " (https://www.youtube.com/watch?v=_LEomvWXOiI) –
Ich vermute, dass "IApp" sowohl eine Schnittstelle und ein Singleton ist. Ich würde es sehr empfehlen, das zu überdenken. Du erhältst keine Stilpunkte, um mehr Muster zu verwenden als der nächste ("Eines Tages ging ich zu einem Brown Bag Lunch, und ein leitender Architekt verkündete stolz, dass er jedes GoF Design Pattern in einem Projekt verwendet hatte. Was er nicht erwähnte war, dass die Software nicht den Erwartungen der Kunden entsprach. Es hat nicht funktioniert. "http://baus.net/doersandtalkers; siehe auch https://code.google.com/archive/p/google-singleton -detektor/wikis/FAQ.wiki) –