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 に答える