循环携带的类依赖

Loop-carried class dependence

本文关键字:依赖 循环      更新时间:2023-10-16

这是我的课程:

class Base {
public:
    template <typename T>
    static struct M {
        T* open(string name, Dir *parent = NULL) {
            if ( parent ) {
                return parent->open_child(name);
            } else {
                auto ans = new T(name);
                ans->open();
                return ans;
            }
        }
    };
    virtual void open() =0;
};
class Dir : public Base {
public:
    template <typename T>
    T* open_child(string name);
    void open();
};
class File : public Base {
public:
    void open();
};

在这里,Dir类要求Base原型,Base要求Dir。前向声明不起作用:只有适合继承和方法调用的完整定义。假设我想将此代码放入 3 个头文件中:Base.h、Dir.h 和 File.h。如何重新制作代码以打破循环依赖关系?

#include <string>
class Dir;
class Base
{
  public:
    template <typename T>
    struct M
    {
      T* open(std::string name, Dir* parent = nullptr);
    };
};
class Dir : public Base
{
  // Further definitions
};
// Implementation
template <typename T>
T* Base::M<T>::open(std::string name, Dir* parent)
{
  // Implementation goes here...
}