我有这样的代码(C ++):
namespace models
{
class model
{
private:
ui::window* win;
};
}
namespace ui
{
class window
{
private:
models::model* modl;
};
}
你可以看到它如此咆哮的地狱。你知道这个代码不能编译,除非我在模型之前提供window
的前向声明,这通常是不合理的,因为上面不是整个代码而且代码也是扩大。
对此有系统的方法吗?
答案 0 :(得分:3)
除非我在模型之前提供窗口的前向声明,这在一般情况下是不合理的
实际上是。您应尽可能使用前向声明而不是包含或完整定义。
但最重要的是,你的设计至少看起来很尴尬。
编辑:每个请求,带有前向声明的代码:
namespace ui
{
class window;
}
namespace models
{
class model
{
private:
ui::window* win;
};
}
//required if this is in a different file
namespace models
{
class model;
}
namespace ui
{
class window
{
private:
models::model* modl;
};
}
答案 1 :(得分:2)
接下来将是打破循环依赖的解决方案 observer pattern会更灵活。
namespace models
{
class modelUser
{
virtual void handleModelUpdate() = 0;
virtual ~modelUser
}
class model
{
public:
model(modelUser* user) : mUser(user) { }
private:
modelUser* mUser;
};
}
namespace ui
{
class window: public models::modelUser
{
private:
models::model* modl;
virtual void handleModelUpdate() { std::cout << "update from model\n"; }
};
}