0

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

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

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

正如你所看到的那样,这是一个喧嚣的地狱。如您所知,此代码无法编译,除非我为window之前的模型提供前向声明,这通常是不合理的,因为上面不是完整的代码,而且代码还将扩展。

有没有系统的方法来解决这个问题?

4

2 回答 2

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;
    };
}
于 2012-05-15T09:19:14.830 回答
2

接下来将是打破循环依赖的解决方案。观察者模式
会更灵活。

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"; }
    };
}
于 2012-05-15T09:33:00.537 回答