我有一个棘手的循环包含问题,我不知道如何解决。综上所述:从Component
Component
模板函数导致循环包含
继承实现在其头文件中的模板函数使用
IApp::registerForEvent
我可以使用哪些技术或方法来解决/避免这种夹杂?
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");
// ...
}
};
如果您使用前向声明,则可以编译,但是通过询问“是IApp”是否真的是“Component”来解决问题? “我可以把IApp分成两类:一个是Component还是一个ComponentRegistry,或许?” (https://www.youtube.com/watch?v=_LEomvWXOiI) –
我怀疑'IApp'既是一个接口又是一个单例。我强烈建议重新考虑这一点。你没有比下一个人更习惯使用更多模式的样式点(“有一天,我去了一个棕色袋子午餐,一位首席建筑师自豪地宣称他在一个项目中使用了每个GoF设计模式,他没有提到是因为该软件没有达到客户的期望,它不起作用。“http://baus.net/doersandtalkers;另请参阅https://code.google.com/archive/p/google-singleton -detector/wikis/FAQ.wiki) –