声明/定义顺序依赖

时间:2012-05-15 09:17:20

标签: c++ class gcc forward-declaration

我有这样的代码(C ++):

namespace models
{
    class model
    {
        private:
            ui::window* win;
    };
}

namespace ui
{
    class window
    {
        private:
            models::model* modl;
    };
}

你可以看到它如此咆哮的地狱。你知道这个代码不能编译,除非我在模型之前提供window的前向声明,这通常是不合理的,因为上面不是整个代码而且代码也是扩大。

对此有系统的方法吗?

2 个答案:

答案 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"; }
    };
}